Я пытаюсь заставить свой контроллер MVC вернуть PDF-файл, хранящийся в контейнере BLOB-объектов Azure. Браузер клиента прекрасно загрузит PDF, но когда он откроет его, он увидит «Ошибка при загрузке PDF документа». при открытии в Chrome (хотя файл не открывается и в других браузерах).
Я смог загрузить файл на свой компьютер и открыть его, выполнив следующие действия:
public static void DownloadFile()
{
CloudBlockBlob cloudBlockBlob =
CloudBlobContainer.GetBlockBlobReference("document.pdf");
AsyncCallback callback = new AsyncCallback(DownloadComplete);
cloudBlockBlob.BeginDownloadToFile(@"path\document.pdf", FileMode.Create,
callback, new object());
}
Однако я бы не хотел создавать временные файлы на сервере и возвращать их. Я хотел бы просто создать их в памяти и вернуть их клиенту.
Код моего контроллера:
public async Task<FileStreamResult> Test()
{
MemoryStream stream = await BlobStorageUtils.DownloadFile();
return File(stream, "application/pdf", "document.pdf");
}
Код для извлечения файла из контейнера BLOB-объектов
public static async Task<MemoryStream> DownloadFile()
{
CloudBlockBlob cloudBlockBlob =
CloudBlobContainer.GetBlockBlobReference("document.pdf");
MemoryStream stream = new MemoryStream();
await cloudBlockBlob.DownloadToStreamAsync(stream);
return stream;
}
Как я уже говорил, мой файл загружается в браузере нормально, но я получаю сообщение об ошибке при попытке открыть файл.
В конце концов мне бы хотелось, чтобы это работало с любым типом документов, а не только с PDF-файлами.
Редактировать: я должен отметить, что я пробовал это также с файлами изображений (в частности, PNG), и у меня была похожая проблема, когда изображение было повреждено или не могло быть открыто. Тогда я получил ошибку: «Похоже, мы не поддерживаем этот формат файла».
Обновление: см. Мое решение ниже, чтобы узнать, как это работает.