一次读取文件块的有效方法

时间:2016-03-04 03:21:02

标签: .net amazon-web-services amazon-s3 filestream

我正在使用HttpClient.PutAsync尝试使用low level multipart upload for s3。这些是大文件,所以我试图以5MB的块上传它们。

我不确定的是,如何最好地提供具有PutAsync特定长度的任意块?我想一次上传一堆这些块,所以将每个5mb块加载到内存中并不是一个选项 - 它应该根据需要从磁盘流式传输。

例如,要从位置5 * 1024 * 1000开始上传5mb,我可以执行以下操作:

using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
    stream.Seek(5*1024*1000);
    // limit length here to 5mb??
    var content = new StreamContent(stream);
    var response = await httpClient.PutAsync(url, content);
    // etc..
}

但当然这会上传整个文件的剩余部分。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您可以执行字节数组读取,并将byteArray内容发送到PutAsync方法。

例如:

Stream.read(buffer, offset, count)

然后再做

var byteContent = new ByteArrayContent(buffer);
var response = await client.PutAsync(uri, byteContent);

您还可以尝试BufferedStream类,它允许您为流设置缓冲区大小。

没试过,但应该大部分都有效。