Golang io.copy 不复制整个数据

我有一个小代码,从谷歌云存储读取100 MB文件,然后返回输出。


代码对于 1MB 文件工作正常,但对于 100 MB 文件失败。


下面是不起作用的代码


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。全部阅读。从 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]

}


慕田峪4524236
浏览 183回答 1
1回答

皈依舞

io.copy试图复制详细信息,但操作系统不允许这样做。它抛出错误为(*net。OpError)(0xc0003302d0)(写 tcp [::1]:80->[::1]:63014: wsasend: 已建立的连接被主机中的软件中止
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go