从浏览器发送文件时内容是什么类型?

时间:2019-04-03 11:14:14

标签: c# angular asp.net-web-api

我要在前端发布一个FormData以上传文件(uploadReq是HttpRequest)

 this.http.request(uploadReq).subscribe(event => {
      if (event.type === HttpEventType.UploadProgress)
        this.progress = Math.round(100 * event.loaded / event.total!);
      else if (event.type === HttpEventType.Response && event.body !== null)
        this.message = event.body.toString();
    });

然后进入webapi中的方法:

   [HttpPost]
   [Route("api/uploadFiles")]
   public async Task<HttpResponseMessage> UploadFile()

我在哪里有这样的支票:

 if (Request.Content.IsMimeMultipartContent())

如果只是两个通信,那么一切都可以正常工作。但是我需要通过网关服务传递此请求,并且我不知道我应该接受并输出哪种类型:

 [OperationContract]
 [WebInvoke(Method = "POST", UriTemplate = "uploadFiles")]
 Task<bool> uploadFiles(//what type should myFile be? Stream? StreamContent? byte[]? Something other?// myFile);

然后,我需要使用此方法PostAsync来文件:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(ApiUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("multipart/form-data"));
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", someauth)));

    HttpResponseMessage response = await client.PostAsync("uploadFiles", //what should I pass here?//);
    response.EnsureSuccessStatusCode();
}

问题:

我当前尝试进行此操作的结果是,400 bad request或未通过if (Request.Content.IsMimeMultipartContent())错误代码进行406检查。

问题:

  1. OperationContract声明中myFile应该是哪种类型?
  2. 我应该将什么作为参数传递给PostAsync方法?

编辑:经过一些试验和错误(以及大量的谷歌搜索),我想到了:

using (var client = new HttpClient())
{                           
    client.BaseAddress = new Uri(SalesQuotationApiUrl);
    client.DefaultRequestHeaders.Accept.Clear();                           
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("multipart/form-data"));
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", someAuth)));
    MultipartFormDataContent form = new MultipartFormDataContent();
    var streamContent = new StreamContent(myFile);
    var fileContent = new ByteArrayContent(streamContent.ReadAsByteArrayAsync().Result);
    fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
    form.Add(fileContent, "myFile", "index.html");
    HttpResponseMessage response = await client.PostAsync("uploadFiles", form);
    response.EnsureSuccessStatusCode();
}

这实际上将文件发送到Web api并保存。 但是,这给我带来了两个新问题:

  1. 我现在如何知道文件名? form.Add(fileContent, "quoteFiles", "index.html"); <-这是硬编码,我想要原始文件名
  2. 某些垃圾会附加到文件中-例如,当发送html文件时,其开始看起来像这样:
  

-WebKitFormBoundaryAOjBy1u08n59PPW0 Content-Disposition:表单数据; name =“ index.html”; filename =“ index.html”内容类型:   文字/ html

如何清除此杂物?

1 个答案:

答案 0 :(得分:0)

因此,我找到了一种对我有用的方法(发送文件,正确处理的标头和原始文件名)。也许有人可以找到这个有用的东西:

 var incomingContentType = System.ServiceModel.Web.WebOperationContext.Current.IncomingRequest.ContentType;
 var streamContent = new StreamContent(myFile);
 var incomingContentBody = streamContent.ReadAsStringAsync().Result;
 var client = new RestClient("yourApiRouteHere");
 var request = new RestRequest(Method.POST);

 request.AddHeader("cache-control", "no-cache");
 request.AddHeader("Authorization", "yourAuthHere");
 request.AddHeader("content-type", incomingContentType);
 request.AddParameter(incomingContentType, incomingContentBody, ParameterType.RequestBody);

 IRestResponse response = client.Execute(request);
 if (response.StatusCode == System.Net.HttpStatusCode.OK)
     return true;