C#-按块上传文件-错误的最后一个块大小

时间:2018-07-19 12:17:03

标签: c# upload chunks image-file

我正在尝试将大文件按块上传到第三部分服务。但是我有最后一块的问题。最后一块将始终小于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();
 }   

缓冲区已上传到第三方服务。

1 个答案:

答案 0 :(得分:-1)

已解决,有人在评论中发布了更新的代码,但几秒钟后删除了此评论。但是有解决方案。我在

之后添加了这部分
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;

    }

 }