Ошибка при Azure частичной загрузке на файловый ресурс через библиотеку Azure .Storage.Files.Shares. - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь загрузить файлы на Azure файлообменник, используя библиотеку Azure .Storage.Files.Shares.

Если я не разделяю файл (сделав один вызов UploadRange ) это работает нормально, но для файлов более 4 Мб я не смог заставить работать чанкинг. При загрузке файл имеет тот же размер, но не открывается в программе просмотра.

Я не могу установить меньшие значения HttpRanges для большого файла, так как получаю ошибку «тело запроса слишком велико», поэтому я Я разделяю файловый поток на несколько мини-потоков и загружаю весь 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 оно повреждено.

У кого-нибудь есть идеи? Спасибо за любую помощь, вы можете предоставить.

ура

Стив

1 Ответ

3 голосов
/ 03 апреля 2020

Мне удалось воспроизвести проблему. В основном проблема заключается в следующей строке кода:

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();
        }
...