Отправка медиафайлов в файловый ресурс Azure размером более 4 МБ приводит к их повреждению

Я пытаюсь загрузить большие файлы в общий файловый ресурс Azure через библиотеку Azure.Storage.Files.Shares, и у меня возникают проблемы с повреждением всех медиафайлов (изображений, PDF-файлов и т. Д.) Размером более ~ 4 МБ. Файловый ресурс Azure имеет ограничение в 4 МБ для одного запроса, поэтому я разделил загрузку на несколько частей, но она по-прежнему повреждает файлы, несмотря на то, что каждая загрузка фрагмента возвращает 201.

Примечания:

  • Не похоже, что это проблема с необходимостью писать несколько фрагментов, так как я могу записать файл размером 3 МБ на столько фрагментов, сколько захочу, и все будет в полном порядке.
  • Файлы .txt размером более 4 МБ не имеют проблем и полностью отображаются после загрузки.

Эта часть загрузки этой функции в основном копируется / вставляется из единственного другого решения для переполнения стека, которое я нашел по этой проблеме:

public async Task WriteFileFromStream(string fullPath, MemoryStream stream)
{
    // Get pieces of path
    string dirName = Path.GetDirectoryName(fullPath);
    string fileName = Path.GetFileName(fullPath);
    
    ShareClient share = new ShareClient(this.ConnectionString, this.ShareName);

    // Set position of the stream to 0 so that we write all contents
    stream.Position = 0;
    try
    {
        // Get a directory client for specified directory and create the directory if it doesn't exist
        ShareDirectoryClient directory = share.GetDirectoryClient(dirName);
        directory.CreateIfNotExists();

        if (directory.Exists())
        {
            // Get file client
            ShareFileClient file = directory.GetFileClient(fileName);
            
            // Create file based on stream length
            file.Create(stream.Length);

            int blockSize = 300 * 1024; // can be anything as long as it doesn't exceed 4194304
            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); // offset -> buffer.Length-1 (inclusive)
                var resp = file.UploadRange(httpRange, uploadChunk);
                
                Console.WriteLine($"Wrote bytes {offset}-{offset+(buffer.Length-1)} to {fullPath}. Response: {resp.GetRawResponse()}");
                offset += buffer.Length;    // Shift the offset by number of bytes already written
            }

            reader.Close();
        }
        else
        {
            throw new Exception($"Failed to create directory: {dirName}");
        }
    }
    catch (Exception e)
    {
        // Close out memory stream
        throw new Exception($"Error occured while writing file from stream: {e.Message}");
    }
}

Любая помощь по этому поводу приветствуется.


person ThomasJazz    schedule 12.11.2020    source источник
comment
Не могли бы вы попробовать закрыть поток после его загрузки?   -  person Jim Xu    schedule 16.11.2020
comment
@JimXu поток закрывается с помощью reader.Close (); потому что это также освобождает все ресурсы, используемые читателем.   -  person ThomasJazz    schedule 17.11.2020
comment
@ThomasJazz Пожалуйста, используйте функцию, которую я поддерживаю WriteFileAsync. И попробуйте еще раз, спасибо. stackoverflow .com / questions / 64031612 /   -  person Jason Pan    schedule 26.11.2020
comment
Надеюсь, эта функция вам поможет.   -  person Jason Pan    schedule 26.11.2020