«Ошибка при загрузке документа PDF» при возврате PDF из хранилища BLOB-объектов Azure - PullRequest
2 голосов
/ 26 марта 2019

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

Обновление: см. Мое решение ниже, чтобы узнать, как это работает.

1 Ответ

1 голос
/ 26 марта 2019

Решение для этого пришло по этой ссылке: Откройте файл PDF (с использованием байтов), хранящийся в хранилище BLOB-объектов Azure

В итоге я просто сбросил поток байтов из Azure в выходной поток ответа. Однако вы должны убедиться, что тип содержимого ответа установлен на «application / pdf». Мой код закончился так:

Код контроллера:

public async Task<ActionResult> Test()
{
     Response.Buffer = true;
     Response.Clear();
     Response.ContentType = "application/pdf";

     await BlobStorageUtils.DownloadFile(Response.OutputStream);

     return new EmptyResult();
}

Код для извлечения файла из контейнера BLOB-объектов

public static async Task DownloadFile(Stream outputStream)
{
    CloudBlockBlob cloudBlockBlob = 
                                CloudBlobContainer.GetBlockBlobReference("document.pdf");
    await cloudBlockBlob.DownloadToStreamAsync(outputStream);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...