Откройте файл PDF (с использованием байтов), хранящийся в хранилище BLOB-объектов Azure. - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь настроить старую логику для поддержки файлов из BLOB-объектов. Может ли кто-нибудь подсказать мне, как открыть файл PDF, который хранится в хранилище BLOB-объектов Azure.

Я попытался найти и нашел ответ Как загрузить файл в браузер из хранилища BLOB-объектов Azure который использует конфигурацию SAS для этого (если я не ошибаюсь).

Есть ли способ сделать это путем преобразования в байты?

Более ранняя логика, чтобы открыть файл PDF из расположения Windows

Response.Buffer = true;
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.AppendHeader("content-disposition", "inline; filename=" + mapid + ".pdf");

FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
BinaryReader br = new BinaryReader(fs);
Byte[] dataBytes = br.ReadBytes((int)(fs.Length - 1));
Response.BinaryWrite(dataBytes);
br.Close();
fs.Close();

Я переписываю логику для чтения файла из BLOB-объекта, ниже приведен код, который я пробовал до сих пор,

Byte[] dataBytes1;
CloudBlockBlob blobfile = GetStorageAccount(true).GetBlockBlobReference(filename);
blobfile.FetchAttributes();

using (StreamReader blobfilestream = new StreamReader(blobfile.OpenRead()))
{
    dataBytes1 = blobfilestream.CurrentEncoding.GetBytes(blobfilestream.ReadToEnd());
}
Byte[] value = BitConverter.GetBytes(dataBytes1.Length - 1);
Response.BinaryWrite(value);

Но файл не открывается с ошибкой «Не удалось загрузить». Кто-нибудь может направить меня, если это хороший подход к этому?

Ответы [ 4 ]

0 голосов
/ 15 мая 2019
     public async System.Threading.Tasks.Task<ActionResult> DownloadFile()
    {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
        ConfigurationManager.ConnectionStrings["azureconnectionstring"].ConnectionString);
        CloudBlobClient client = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer blobContainer = client.GetContainerReference("my-blob-storage");
    CloudBlockBlob blob = blobContainer.GetBlockBlobReference("filename.pdf");
        var exists = blob.Exists(); // to verify if file exist
        blob.FetchAttributes();
        byte[] dataBytes1;
        using (StreamReader blobfilestream = new StreamReader(blob.OpenRead()))
        {
            dataBytes1 = blobfilestream.CurrentEncoding.GetBytes(blobfilestream.ReadToEnd());
            await blob.DownloadToStreamAsync(Response.OutputStream);
        }

        Byte[] value = BitConverter.GetBytes(dataBytes1.Length - 1);
        string mimeType = "application/pdf";
        Response.AppendHeader("Content-Disposition", "inline; filename=" + "filename.pdf");

        return File(value, mimeType);

}

0 голосов
/ 02 ноября 2018

Вы можете использовать DownloadToByteArray, пример кода (в проекте asp.net mvc), как показано ниже, и отлично работает на моей стороне:

        public ActionResult DownloadFile()
        {
            CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials("your_account", "your_key"), true);
            CloudBlobClient client = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer blobContainer = client.GetContainerReference("t11");
            CloudBlockBlob blob = blobContainer.GetBlockBlobReference("ss22.pdf");

            blob.FetchAttributes();

            long fileByteLength = blob.Properties.Length;
            byte[] fileContent = new byte[fileByteLength];
            for (int i=0;i<fileByteLength;i++)
            {
                fileContent[i] = 0x20;
            }

            blob.DownloadToByteArray(fileContent,0);

            Response.BinaryWrite(fileContent);

            return new EmptyResult();
        }

Или, как упоминалось в @hardkoded, вы можете использовать DownloadToStreamAsync или DownloadToStream для своих нужд.

Пример кода, как показано ниже (проект asp.net mvc):

        public ActionResult DownloadFile()
        {
            CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials("your_account", "your_key"),true);
            CloudBlobClient client = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer blobContainer = client.GetContainerReference("t11");
            CloudBlockBlob blob = blobContainer.GetBlockBlobReference("ss22.pdf");

            blob.DownloadToStream(Response.OutputStream);

            return new EmptyResult();
        }

Результат теста, как показано ниже: enter image description here

0 голосов
/ 02 ноября 2018

Как указано выше, вам необходимо использовать DownloadToStreamAsync. Ниже мой код.

        blobfile.FetchAttributes();

        using (StreamReader blobfilestream = new StreamReader(blobfile.OpenRead()))
        {
            dataBytes1 = blobfilestream.CurrentEncoding.GetBytes(blobfilestream.ReadToEnd());
            await blobfile.DownloadToStreamAsync(Response.OutputStream);
        }

        Byte[] value = BitConverter.GetBytes(dataBytes1.Length - 1);
        string mimeType = "application/pdf";
        Response.AppendHeader("Content-Disposition", "inline; filename="+ filename);

        return File(value, mimeType);
0 голосов
/ 31 октября 2018

Вы можете использовать DownloadToStreamAsync и использовать Response.OutputStream в качестве потока назначения.

await blob.DownloadToStreamAsync(Response.OutputStream);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...