Потоковая передача большого двоичного объекта из хранилища Azure. Невозможно получить доступ к закрытому потоку. - PullRequest
0 голосов
/ 01 сентября 2018

Я использую веб-формы asp.net.

У меня есть файлы PDF в хранилище Azure, которые мне нужно обработать. Для этого я использую библиотеку PDFJet.

Я бы хотел потоковое воспроизведение PDF без загрузки, так как мне нужно обработать большое количество PDF.

Я использую следующую функцию для потоковой передачи PDF из Azure:

public MemoryStream DownloadToMemoryStream(DTO.BlobUpload b)
{
    CloudStorageAccount storageAccount = Conn.SNString(b.OrgID);
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobClient.GetContainerReference(b.Container);
    CloudBlockBlob blob = container.GetBlockBlobReference(b.FileName);
    var sasToken = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
    {
        Permissions = SharedAccessBlobPermissions.Read,
        SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10),//assuming the blob can be downloaded in 10 miinutes
    }, new SharedAccessBlobHeaders()
    {
        ContentDisposition = "attachment; filename=file-name"
    });
    using (MemoryStream ms = new MemoryStream())
    {
        blob.DownloadToStream(ms);
        return ms;
    }

}

И на странице aspx.cs следующий код для чтения потока PDF:

BufferedStream pdfScript = new BufferedStream(new FileStream(ScriptPath + Script, FileMode.Open));

SortedDictionary<Int32, PDFobj> objects = pdfFinalScript.Read(pdfScript);

Однако я получаю сообщение об ошибке: не удается получить доступ к закрытому потоку

Если я загружаю pdf на диск, я использую эту функцию, это работает, но это не практично:

blockBlob.DownloadToFile(b.LocalPath + b.FileName, FileMode.Create);

BufferedStream pdfScript = new BufferedStream(new FileStream(ScriptPath + Script, FileMode.Open));

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 03 сентября 2018

Невозможно получить доступ к закрытому потоку

Согласно информации об ошибке, это означает, что вам нужно сбросить позицию потока.

Пожалуйста, попробуйте сбросить позицию потока перед возвратом. blob.DownloadToStream (мс); ms.Position = 0; // добавить этот код вернуть мс;

Изменено:

ms закрыто, если не используется секция. Поэтому, пожалуйста, попробуйте использовать следующий код.

MemoryStream stream = new MemoryStream();
using (MemoryStream ms = new MemoryStream())
{
  blob.DownloadToStream(ms);
  ms.Position = 0
  ms.CopyTo(stream);
  stream.Position = 0;
  return stream;
}
...