通过 Azure.Storage.Files.Shares 库将 Azure 分块上传到文件共享的问题

Ste*_*e B 2 fileshare azure

我正在尝试使用库 Azure.Storage.Files.Shares 将文件上传到 Azure 文件共享。

如果我不分块文件(通过进行单个 UploadRange 调用),它工作正常,但对于超过 4Mb 的文件,我无法使分块工作。下载时文件大小相同,但不会在查看器中打开。

我无法在大文件上设置较小的 HttpRange,因为我收到“请求正文太大”错误,因此我将文件流拆分为多个迷你流并上传每个流的整个 HttpRange

        ShareClient share = new ShareClient(Common.Settings.AppSettings.AzureStorageConnectionString, ShareName());
        ShareDirectoryClient directory = share.GetDirectoryClient(directoryName);

        ShareFileClient file = directory.GetFileClient(fileKey);
        using(FileStream stream = fileInfo.OpenRead())
        {
            file.Create(stream.Length);

            //file.UploadRange(new HttpRange(0, stream.Length), stream);

            int blockSize = 128 * 1024;

            BinaryReader reader = new BinaryReader(stream);
            while(true)
            {
                byte[] buffer = reader.ReadBytes(blockSize);
                if (buffer.Length == 0)
                    break;

                MemoryStream uploadChunk = new MemoryStream();
                uploadChunk.Write(buffer, 0, buffer.Length);
                uploadChunk.Position = 0;

                file.UploadRange(new HttpRange(0, uploadChunk.Length), uploadChunk);
            }

            reader.Close();
        }
Run Code Online (Sandbox Code Playgroud)

上面的代码上传没有错误,但是从 Azure 下载图像时它已损坏。

有没有人有任何想法?感谢您的任何帮助,您可以提供。

干杯

史蒂夫

Gau*_*tri 7

我能够重现这个问题。基本上问题在于以下代码行:

new HttpRange(0, uploadChunk.Length)
Run Code Online (Sandbox Code Playgroud)

本质上,您总是将内容设置在相同的范围内,这就是文件损坏的原因。

请尝试下面的代码。它应该工作。我在这里所做的是定义 HTTP 范围偏移量,并随着已写入文件的字节数不断移动它。

        using (FileStream stream = fileInfo.OpenRead())
        {
            file.Create(stream.Length);

            //file.UploadRange(new HttpRange(0, stream.Length), stream);

            int blockSize = 1 * 1024;
            long offset = 0;//Define http range offset
            BinaryReader reader = new BinaryReader(stream);
            while (true)
            {
                byte[] buffer = reader.ReadBytes(blockSize);
                if (buffer.Length == 0)
                    break;

                MemoryStream uploadChunk = new MemoryStream();
                uploadChunk.Write(buffer, 0, buffer.Length);
                uploadChunk.Position = 0;

                HttpRange httpRange = new HttpRange(offset, buffer.Length);
                var resp = file.UploadRange(httpRange, uploadChunk);
                offset += buffer.Length;//Shift the offset by number of bytes already written
            }

            reader.Close();
        }
Run Code Online (Sandbox Code Playgroud)