【问题标题】:C# - upload file by chunks - bad last chunk sizeC# - 按块上传文件 - 错误的最后一个块大小
【发布时间】:2018-12-27 13:59:48
【问题描述】:

我正在尝试将大文件分块上传到第 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();
 }   

缓冲区在 3rd 方服务上上传。

【问题讨论】:

  • 简短的回答是您应该上传n 字节,而不是chunkSize 字节。
  • 不清楚chunkSize来自哪里,但应该是streamx.Read(buffer, 0, buffer.Length);
  • 错误在// do work on buffer...// uploading chunk .... - 你需要向我们展示该代码。
  • @mjwills 添加上传块的方法,谢谢
  • 不要上传 buffer - 只是它的第一个 n 字节。

标签: c# upload chunks image-file


【解决方案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;

    }

 }   

【讨论】:

  • 这不是一个好主意。根据 @xanatos 之前的评论 - A Stream could return 1 byte at a time... after this you would have a small buffer forever.
  • 应该只上传buffer 的第一个n 字节。 var g = buffer; if (n < buffer.Length) g = g.Take(n).ToArray(); 然后将g 上传到buffer 内。
  • @mjwills 好的,您将如何解决?从缓冲区上传 n 个字节?
  • 查看我之前的评论@Karel_za。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 2013-01-16
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 2018-05-28
  • 2017-01-11
相关资源
最近更新 更多