Загрузите PDF-файл в BLOB-объект Azure, используя функцию Azure. - PullRequest
0 голосов
/ 18 июня 2019

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

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

public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
        {
            log.Info(req.Content.ToString());
            string Message = "";
            log.Info("Test storage conn string" + req.Content.Headers.ContentDisposition.ToString());
            string contentType = req.Content.Headers?.ContentType?.MediaType;
            log.Info("contentType : " + req.Content.IsMimeMultipartContent());
            string name = Guid.NewGuid().ToString("n");
            log.Info("Name" + name);
            string body;

            body = await req.Content.ReadAsStringAsync();

            log.Info("body" + body.Substring(body.IndexOf("filename=\""),body.IndexOf("pdf")- body.IndexOf("filename=\"")));
            //Upload a file to Azure blob
            string storageConnectionString = "xxxx";

            //DirectoryInfo directoryInfo = new DirectoryInfo("D:\\Upload_Files");

           // var files = directoryInfo.EnumerateFiles();

            // Retrieve storage account from connection string.
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString);

            // Create the blob client.
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

            // Retrieve reference to a previously created container.
            CloudBlobContainer container = blobClient.GetContainerReference("docstorage");

            //foreach (FileInfo inputFile in files)
            //{

                CloudBlockBlob blockBlob = container.GetBlockBlobReference("Test\\" + name+".pdf");//write name here
            //blockBlob.Properties.ContentType = "application/pdf";
                //blockBlob.UploadFromFile(inputFile.FullName);
            using (Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(body)))
            {
                log.Info("streaming : ");
                await blockBlob.UploadFromStreamAsync(stream);
            }
            //}


            return Message == null
                ? req.CreateResponse(HttpStatusCode.BadRequest, "Error")
                : req.CreateResponse(HttpStatusCode.OK, "Doc Uploaded Successfully");
        }

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

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Вызов .ReadAsStringAsync для двоичного документа не сработает - вы должны позвонить ReadAsByteArrayAsync или ReadAsStreamAsync.

var body = await req.Content.ReadAsByteArrayAsync();
...
using (Stream stream = new MemoryStream(body))
{
    await blockBlob.UploadFromStreamAsync(stream);
}

OR

var body2 = await req.Content.ReadAsStreamAsync();
body.Position = 0;
...
await blockBlob.UploadFromStreamAsync(body);
0 голосов
/ 19 июня 2019

Это действительно просто сделать что-то подобное.Все, что связано с привязками, должно быть объявлено в параметрах функции, поэтому, имея это в виду, вы должны объявить свой поток больших двоичных объектов как параметр.Проверьте это в качестве примера:


    public static async Task<string> Run(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
        [Blob("azurefunctions/test.pdf", FileAccess.Write)] Stream blob,
        ILogger log)

Обратите внимание, что второй параметр с именем blob объявлен как Stream , чтобы иметь возможность сохранять содержимое, прочитанное извход.Второй момент - это атрибут, который украшает параметр: Blob позволяет определить несколько аспектов нового файла BLOB-объекта, который будет загружен в наш сервис Azure Storage .Как видите, контейнер называется azurefunctions , а файл будет называться test.pdf .

. Для сохранения содержимого вы можете использовать следующий код:


    byte[] content = new byte[req.Body.Length];
    await req.Body.ReadAsync(content, 0, (int)req.Body.Length);
    await blob.WriteAsync(content, 0, content.Length);

Надеюсь, что это может быть полезно для вашего вопроса.

Это полезные ссылки для проверки и проверки вашего кода:

...