Golang io.copy 没有复制整个数据

Golang io.copy not copying entire data

我有一些小代码,可以从 Google 云存储中读取 100 MB 的文件,然后 return 输出。

代码适用于 1MB 的文件,但适用于 100mb 的文件。

下面是无效的代码

rc, err := client.Bucket("mabucket").Object(gcpurl).NewReader(ctx)
    if err != nil {
        fmt.Println(err)

        return
    }
    defer rc.Close()

    w.Header().Set("Content-Length", strconv.Itoa(int(rc.Size())))
    w.Header().Set("Cache-Control", "max-age=2592000")
    w.Header().Set("Content-Type", rc.ContentType())

    spew.Dump(rc.ContentType())

    if rc.ContentType() == "audio/wav" || rc.ContentType() == "audio/wave" {
        w.Header().Set("Accept-Ranges", "bytes")

        tilrange := rc.Size() - 1
        newRangeString := "bytes 0-" + strconv.Itoa(int(tilrange)) + "/" + strconv.Itoa(int(rc.Size()))
        w.Header().Set("Content-Range", newRangeString)
        w.WriteHeader(206)

    }

    //spew.Dump(rc.Attrs)

    io.Copy(w, rc)

我写了另一个代码,它能够下载相同的文件并创建一个 100 MB 的本地文件。 这次我用的是ioutil.ReadAll。从 GCP 接收大日期时,io.copy 会出现什么问题?

func main() {

    ctx := context.Background()
    client, _ := storage.NewClient(ctx)

    
    data, err := downloadFile(client, "mabucket", "606ff2b71a916907409a953f/606ff2ed1a916907409a9540/60a38a967b291f7b44488824/123/audio/210415164000M29713363.wav")
    //210415164000M29713363.wav

    if err != nil {
        log.Fatalf("Cannot read object: %v", err)
    }

    fmt.Printf("Object contents: %d\n", len(data))

    f, err := os.Create("a.wav")
    check(err)
    defer f.Close()

    n2, err := f.Write(data)
    check(err)
    fmt.Printf("wrote %d bytes\n", n2)
}

// downloadFile downloads an object.
func downloadFile(client *storage.Client, bucket, object string) ([]byte, error) {
    // [START download_file]
    ctx := context.Background()

    ctx, cancel := context.WithTimeout(ctx, time.Second*50)
    defer cancel()
    rc, err := client.Bucket(bucket).Object(object).NewReader(ctx)
    if err != nil {
        return nil, err
    }
    defer rc.Close()

    data, err := ioutil.ReadAll(rc)
    if err != nil {
        return nil, err
    }
    return data, nil
    // [END download_file]
}

io.copy 试图复制详细信息,但 OS 不允许。它抛出错误为 (*net.OpError)(0xc0003302d0)(write tcp [::1]:80->[::1]:63014: wsasend: 已建立的连接被主机中的软件中止