c# - C# - 按块上传文件 - 错误的最后一个块大小
问题描述
我正在尝试将大文件按块上传到第 3 部分服务。但我对最后一块有问题。最后一个块总是小于 5mb,但所有块包括。最后一个大小相同 - 5mb 我的代码:
int chunkSize = 1024 * 1024 * 5;
using (Stream streamx = new FileStream(file.Path, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[chunkSize];
int bytesRead = 0;
long bytesToRead = streamx.Length;
while (bytesToRead > 0)
{
int n = streamx.Read(buffer, 0, chunkSize);
if (n == 0) break;
// do work on buffer...
// uploading chunk ....
var partRequest = HttpHelpers.InvokeHttpRequestStream
(
new Uri(endpointUri + "?partNumber=" + i + "&uploadId=" + UploadId),
"PUT",
partHeaders,
buffer
); // upload buffer
bytesRead += n;
bytesToRead -= n;
}
streamx.Dispose();
}
缓冲区上传到第 3 方服务。
解决方案
解决了,有人在评论中发布了更新的代码,但几秒钟后删除了这条评论。但是有解决办法。我在之后添加了这部分
if (n == 0)
这段代码,它将最后一个块的大小调整到正确的大小
// Let's resize the last incomplete buffer
if (n != buffer.Length)
Array.Resize(ref buffer, n);
谢谢你们。
我发布完整的工作代码:
int chunkSize = 1024 * 1024 * 5;
using (Stream streamx = new FileStream(file.Path, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[chunkSize];
int bytesRead = 0;
long bytesToRead = streamx.Length;
while (bytesToRead > 0)
{
int n = streamx.Read(buffer, 0, chunkSize);
if (n == 0) break;
// Let's resize the last incomplete buffer
if (n != buffer.Length)
Array.Resize(ref buffer, n);
// do work on buffer...
// uploading chunk ....
var partRequest = HttpHelpers.InvokeHttpRequestStream
(
new Uri(endpointUri + "?partNumber=" + i + "&uploadId=" + UploadId),
"PUT",
partHeaders,
buffer
); // upload buffer
bytesRead += n;
bytesToRead -= n;
}
}
推荐阅读
- java - SQLite 中的日期类型
- angular - ngModel,使用取消选项更新子组件中的值
- tensorflow - Tensorflow:张量必须来自与张量相同的图
- javascript - 无法获得关于何时使用 applescript 调用 jquery 的正确时机
- db2 - 通过 pentaho 将数据从 csv 输入到 db2 中的 sql 表
- algorithm - 在数组中找到三个数字的算法,使得 a< b < c 和 v[a]
给定一个整数向量,我需要找出向量中是否存在三个元素
a, b, c
,使得a < b< c
和v[a] < v[c] < v[b]
。到目前为止,我的方法如下。首先,我忘记了 a 并为向量中的每个数字找到位于该元素左侧的 v[i] 的最小值。我将此
- java - 有没有办法在运行时更改 java 方法的访问修饰符?
- laravel - 当前后端用户以 octobercms 形式生成窄关系
- bash - 在 bash 中使用 sed 命令添加新行
- tomcat - 我在哪里可以告诉 Tomcat 已部署应用程序的数据将存储在哪里?