Я пытаюсь загрузить большие файлы в общий файловый ресурс 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}");
}
}
Любая помощь по этому поводу приветствуется.
WriteFileAsync
. И попробуйте еще раз, спасибо. stackoverflow .com / questions / 64031612 / - person Jason Pan   schedule 26.11.2020