Goを使い始めたばかりで、助けが必要です。ファイルから特定の範囲のバイトをアップロードしたいと思います。
私はすでにバイトをバッファに読み込むことでこれを達成しました。ただし、これによりメモリ使用量が増加します。バイトをメモリに読み込むのではなく、アップロード中にそれらをストリーミングして、アップロードの進行状況を確認します。私はNode.jsでこのようなことをしましたが、パズルのピースをGoにまとめるのに苦労しました。私が今持っているコードは次のようになります:
func uploadChunk(id, mimeType, uploadURL, filePath string, offset, size uint) {
// open file
file, err := os.Open(filePath)
panicCheck(err, ErrorFileRead) // custom error handler
defer file.Close()
// move to the proper byte
file.Seek(int64(offset), 0)
// read byte chunk into buffer
buffer := make([]byte, size)
file.Read(buffer)
fileReader := bytes.NewReader(buffer)
request, err := http.NewRequest(http.MethodPut, uploadURL, fileReader)
client := &http.Client{
Timeout: time.Second * 10,
}
response, err := client.Do(request)
panicCheck(err, ErrorFileRead)
defer response.Body.Close()
b, err := httputil.DumpResponse(response, true)
panicCheck(err, ErrorFileRead)
fmt.Println("response\n", string(b))
}
アップロードのストリーミングと進行状況を把握する方法を教えてください。
ありがとう
を使用しio.LimitedReader
てファイルをラップし、必要な量のデータのみを読み取ることができます。返された実装がio.LimitReader
あります*io.LimitedReader
。
file.Seek(int64(offset), 0)
fileReader := io.LimitReader(file, size)
request, err := http.NewRequest(http.MethodPut, uploadURL, fileReader)
S3の場合は、ContentLengthを明示的に設定して、チャンクエンコーディングを使用しないようにする必要があります。
request.ContentLength = size
アップロードの進行状況については、Go:POSTリクエストの進行状況の追跡を参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加