簡體   English   中英

分段數據上傳 - Azure Function V2

[英]Multipart Data Upload - Azure Function V2

正在將文檔上傳到 HTTP 觸發器 Azure 函數(版本 2)。 在我的函數中收到請求時,我看到 Files 部分為空,並且流被移動到 formdata 字典。 下面是如何上傳文檔的代碼,有人可以幫助我為什么它不在 IFormFileCollection 中填充流。


      using (var _httpClient = new HttpClient())
            {
                MultipartFormDataContent form = new MultipartFormDataContent();
                String headerValue = "form-data; name=\"file\"; filename=\"" + fileName + "\"";
                byte[] bytes = Encoding.UTF8.GetBytes(headerValue);
                headerValue = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
                fileContent.Headers.Add("Content-Disposition", headerValue);
                fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
                form.Add(fileContent);
                form.Add(new StringContent(metadataValue), metadataKey);
                _httpClient.Timeout = TimeSpan.FromMinutes(15);
                _httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + bearerToken);
                logger.LogInformation($"HttpUtils: UploadFileByMultipart() url:{url}, request param: {metadataValue} reference: {traceLogId}");
                var response = await _httpClient.PostAsync(url, form).Result.Content.ReadAsStringAsync();
                logger.LogInformation("HttpUtils: UploadFileByMultipart() end");
                return response;
            }

在函數中接收的內容

其他注意如何從字符串格式的 Formdata 字典中獲取流並將其轉換為我可以玩的流。 我在下面嘗試過,結果是一個空白文檔,破壞了所有流

        requestHandler.stream = new MemoryStream();
        var Content = formdata["file"].ToString();
        var fileContent = new MemoryStream(Encoding.ASCII.GetBytes(Content));

如果我們想使用HttpClient發送 Multipart Data,可以使用MultipartFormDataContent來創建數據。

例如

我發送請求的代碼

MultipartFormDataContent form = new MultipartFormDataContent();

            form.Add(new StringContent("jack"), "userName");

            var fileContent = new ByteArrayContent(File.ReadAllBytes(@"D:\my.csv"));

            // I use package MimeMapping : https://www.nuget.org/packages/MimeMapping/ to get file mine type
            fileContent.Headers.ContentType = new MediaTypeHeaderValue(MimeUtility.GetMimeMapping("my.csv"));
            fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            {
                Name = "file",
                FileName = "my.csv"
            };
            form.Add(fileContent);

            using (var client = new HttpClient())
            {
                var res = await client.PostAsync("<function app url>", form);
                if (res.IsSuccessStatusCode)
                {
                    var content = await res.Content.ReadAsStringAsync();
                    Console.WriteLine(content);

                }

            }
  1. 我的函數應用代碼
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
  ILogger log)
{
            log.LogInformation("C# HTTP trigger function processed a request.");

            log.LogInformation("-------------------read file----------------------");
            // read file
            var files = req.Form.Files;
            if (files.Count != 0) {
                var file = files[0];
                
                log.LogInformation(file.ContentType);
                log.LogInformation(file.FileName);
                log.LogInformation(file.ContentDisposition);
                // use file.OpenReadStream to get a stream then use stream to rread file content

            }

            // read key

            log.LogInformation("-------------------read key----------------------");
            log.LogInformation($"The userName is {req.Form["userName"]}");

            return new OkObjectResult("OK");
}

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM