PUT使用流和进度上传文件的字节范围

时间:2017-11-20 15:23:28

标签: http go upload 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))
}

你们能帮助我弄清楚如何上传和获取上传进度吗?

由于

1 个答案:

答案 0 :(得分:1)

您可以使用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: Tracking POST request progress