PUT 使用流和进度上传文件的字节范围
PUT upload a file's byte range with streams and progress
我刚开始使用 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
to wrap the file and only read the amount of data you want. The implementation returned by 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: Tracking POST request progress
我刚开始使用 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
to wrap the file and only read the amount of data you want. The implementation returned by 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: Tracking POST request progress