Golang从URL获取文件大小的方法
Golang从URL获取文件大小的方法 我想通过URL获取文件大小 我尝试使用以下代码:
out, err := exec.Command("curl", "-sI", url, "|", "grep", "-i", "Content-Length", "|", "cut", "-c17-").Output();
URL为:http://speedtest-sgp1.digitalocean.com/5gb.test 但我得到了错误码6 为什么?
4 回复
因为 curl 不理解 | 以及其后所有内容的含义。
没有 shell 参与其中。
更多关于Golang从URL获取文件大小的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
好的,但在这种情况下,我该如何在 Go 中从 URL 获取文件大小呢?
我会使用Go的HTTP客户端来发起HEAD请求:
httpClient := &http.Client{Timeout: 5 * time.Second}
resp, err := httpClient.Head(url)
if err != nil {
log.Fatalf("error on HEAD request: %s", err.Error())
}
fmt.Printf("Content-Length: %d \n", resp.ContentLength)
如果你必须使用cURL,你可以要么在Go中发起cURL请求并自行解析输出:
curlOut, err := exec.Command("curl", "-sI", url).Output()
if err != nil {
log.Fatalf("error on CURL: %s", err.Error())
}
// 这个输出是一个响应头列表,你可以自行解析
fmt.Println(string(curlOut))
要么调用一个shell,以便你可以使用你的cut命令:
curlOut, err := exec.Command(
"/bin/bash",
"-c",
fmt.Sprintf("curl -sI %s | grep -i content-length | cut -c17-", url)).Output()
if err != nil {
log.Fatalf("error on CURL: %s", err.Error())
}
fmt.Printf("Content-Length: %s", curlOut)
你的代码使用了 exec.Command 调用外部命令,但管道符号 | 在 Go 的 exec.Command 中不会被 shell 解析,这会导致错误。错误码 6 通常表示 curl 无法解析你传递的整个字符串作为 URL。
更好的方法是使用 Go 内置的 HTTP 客户端来获取文件大小,示例如下:
package main
import (
"fmt"
"net/http"
"strconv"
)
func getFileSizeFromURL(url string) (int64, error) {
resp, err := http.Head(url)
if err != nil {
return 0, err
}
defer resp.Body.Close()
contentLength := resp.Header.Get("Content-Length")
if contentLength == "" {
return 0, fmt.Errorf("Content-Length header not found")
}
size, err := strconv.ParseInt(contentLength, 10, 64)
if err != nil {
return 0, err
}
return size, nil
}
func main() {
url := "http://speedtest-sgp1.digitalocean.com/5gb.test"
size, err := getFileSizeFromURL(url)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("File size: %d bytes\n", size)
}
这段代码使用 http.Head 方法发送 HEAD 请求,只获取响应头而不下载文件内容,然后从 Content-Length 头中解析文件大小。

