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

Issue with Azure chunked upload to fileshare via Azure.Storage.Files.Shares library

我正在尝试使用库 Azure.Storage.Files.Shares.

将文件上传到 Azure 文件共享

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

我无法在大文件上设置较小的 HttpRanges,因为我收到 'request body is too large' 错误,所以我将文件流拆分为多个迷你流并上传每个流的整个 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();
        }

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

有人有什么想法吗?感谢您提供的任何帮助。

干杯

史蒂夫

我能够重现该问题。基本上问题出在以下代码行:

new HttpRange(0, uploadChunk.Length)

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

请尝试下面的代码。它应该工作。我在这里所做的是定义 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();
        }