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

.net 一次读取文件块的有效方法,.net,amazon-web-services,amazon-s3,filestream,.net,Amazon Web Services,Amazon S3,Filestream,我正在尝试使用,使用HttpClient.PutAsync。这些都是大文件,所以我尝试上传5MB的文件块 我不确定的是,如何最好地将具有特定长度的任意块提供给PutAsync?我想一次上传一堆这样的数据块,所以将每个5mb的数据块加载到内存中并不是一个真正的选项——它应该根据需要从磁盘上进行流式传输 例如,要从位置5*1024*1000开始上传5mb,我可以执行以下操作: using (var stream = new FileStream(path, FileMode.Open, FileAc

我正在尝试使用,使用
HttpClient.PutAsync
。这些都是大文件,所以我尝试上传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..
}
当然,这将上载文件的整个剩余部分


有什么建议吗?

您可以读取字节数组,然后将byteArray内容发送到PutAsync方法

例如:

然后呢

var byteContent = new ByteArrayContent(buffer);
var response = await client.PutAsync(uri, byteContent);
您还可以尝试
BufferedStream
类,该类允许您为流设置缓冲区大小


还没有尝试过,但基本上可以用。

不幸的是,这需要将整个块大小(2mb)读入内存…请注意,在多部分上传中,每个部分(当然最后一部分除外)的最小部分大小实际上是5MB。感谢您指出,我更新了帖子以避免混淆。我不熟悉.net,所以我没有答案,但我希望你会发现避免将这些块读入内存是不切实际的。为了计算确保每个部分准确传输的
Content-MD5:
请求头,您至少需要通读整个数据块。它在技术上是可选的,但实际上是关键的,因为它是S3绝对拒绝在传输过程中以任何方式损坏的数据块的唯一保证。同样重要的是,您不需要同时发送超过8个部分——超过某个阈值,您将不会获得更多吞吐量,因为你会使你的连接饱和。我已经写了我自己的多部分上传,我可以饱和一个100兆位/秒的连接,大约8个部分并行,这取决于我上传到哪个S3区域。(当距离较大时,需要更多平行部件使链路饱和。)
var byteContent = new ByteArrayContent(buffer);
var response = await client.PutAsync(uri, byteContent);