我要在前端发布一个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
检查。
问题:
myFile
应该是哪种类型?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并保存。 但是,这给我带来了两个新问题:
form.Add(fileContent, "quoteFiles", "index.html");
<-这是硬编码,我想要原始文件名-WebKitFormBoundaryAOjBy1u08n59PPW0 Content-Disposition:表单数据; name =“ index.html”; filename =“ index.html”内容类型: 文字/ html
如何清除此杂物?
答案 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;