我有一個小代碼,從谷歌云存儲讀取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]}
Golang io.copy 不復制整個數據
慕田峪4524236
2022-08-30 21:47:09