使用Golang下载并存储zip文件的实现方法

使用Golang下载并存储zip文件的实现方法 我正在从服务器收集日志文件并将其本地存储以进行后续处理。日志以压缩包形式下载。如果我运行这段代码,确实会创建文件,但文件是空的。如果我将URL粘贴到浏览器中,确实能下载完整的文件。对于如何修复这个问题有什么建议吗?我不关心解压文件,只需要下载并存储。

func DownloadFile(filepath string, url string) error {

    request, httpErr := http.NewRequest("GET", url, nil)

    // 在数据收集期间忽略证书
    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    }
    if httpErr != nil {
        fmt.Printf("The HTTP request failed with error %s\n", httpErr)
    }
    client := &http.Client{Transport: tr}

    response, err := client.Do(request)

    defer response.Body.Close()

    // 创建文件
    out, err := os.Create(filepath)
    if err != nil {
        return err
    }
    defer out.Close()

    // 将响应体写入文件
    _, err = io.Copy(out, response.Body)
    return err
}

更多关于使用Golang下载并存储zip文件的实现方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复
你好,Kevin,我怀疑问题可能是你的请求没有返回200状态码。根据[这里](https://golang.org/pkg/net/http/#Client.Do)的文档,非200状态码不会从`(*Client).Do`返回错误。在调用`client.Do`之后,请检查`response.Status`或`response.StatusCode`等字段。

更多关于使用Golang下载并存储zip文件的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


func main() {
    fmt.Println("hello world")
}
package main

import "fmt"

func main() {
    fmt.Println("你好,世界")
}
// 这是一个Go语言代码示例
func greet(name string) string {
    return "你好," + name
}
// 身份验证相关代码
func authenticate(user string, password string) bool {
    // 身份验证逻辑
    return true
}

您的代码中存在几个关键问题导致下载的文件为空。主要问题是错误处理不完整以及在读取响应体之前没有检查HTTP状态码。以下是修复后的实现:

func DownloadFile(filepath string, url string) error {
    // 创建HTTP请求
    request, err := http.NewRequest("GET", url, nil)
    if err != nil {
        return fmt.Errorf("创建请求失败: %v", err)
    }

    // 配置忽略证书验证的传输层
    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    }
    
    client := &http.Client{Transport: tr}

    // 执行请求
    response, err := client.Do(request)
    if err != nil {
        return fmt.Errorf("HTTP请求失败: %v", err)
    }
    defer response.Body.Close()

    // 检查HTTP状态码
    if response.StatusCode != http.StatusOK {
        return fmt.Errorf("服务器返回错误状态码: %d", response.StatusCode)
    }

    // 创建目标文件
    out, err := os.Create(filepath)
    if err != nil {
        return fmt.Errorf("创建文件失败: %v", err)
    }
    defer out.Close()

    // 将响应体写入文件
    _, err = io.Copy(out, response.Body)
    if err != nil {
        return fmt.Errorf("写入文件失败: %v", err)
    }

    return nil
}

主要修复点:

  1. 完整的错误检查:为每个可能失败的操作添加了适当的错误处理
  2. HTTP状态码验证:添加了对200状态码的检查,确保请求成功
  3. 改进的错误信息:提供了更详细的错误上下文

使用示例:

func main() {
    err := DownloadFile("logs.zip", "https://example.com/logs.zip")
    if err != nil {
        fmt.Printf("下载失败: %v\n", err)
        return
    }
    fmt.Println("文件下载完成")
}

这个修复版本会确保只有在HTTP请求成功且响应体正常读取的情况下才会创建和写入文件。

回到顶部