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 头中解析文件大小。

回到顶部