Gio*_*bbo 12 c# asp.net asp.net-web-api
我将多部分表单数据发送到我的Web API,如下所示:
string example = "my string";
HttpContent stringContent = new StringContent(example);
HttpContent fileStreamContent = new StreamContent(stream);
using (var client = new HttpClient())
{
using (var content = new MultipartFormDataContent())
{
content.Add(stringContent, "example", "example");
content.Add(fileStreamContent, "stream", "stream");
var uri = "http://localhost:58690/api/method";
HttpResponseMessage response = await client.PostAsync(uri, content);
Run Code Online (Sandbox Code Playgroud)
这是Web API:
[HttpPost]
[Route("api/method")]
public async Task<HttpResponseMessage> Method()
{
// take contents and do something
}
Run Code Online (Sandbox Code Playgroud)
如何在Web API中读取请求体中的字符串和流?
Big*_*ddy 14
这应该可以帮助您入门:
var uploadPath = HostingEnvironment.MapPath("/") + @"/Uploads";
Directory.CreateDirectory(uploadPath);
var provider = new MultipartFormDataStreamProvider(uploadPath);
await Request.Content.ReadAsMultipartAsync(provider);
// Files
//
foreach (MultipartFileData file in provider.FileData)
{
Debug.WriteLine(file.Headers.ContentDisposition.FileName);
Debug.WriteLine("File path: " + file.LocalFileName);
}
// Form data
//
foreach (var key in provider.FormData.AllKeys)
{
foreach (var val in provider.FormData.GetValues(key))
{
Debug.WriteLine(string.Format("{0}: {1}", key, val));
}
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*avy 11
这是我之前用来接收json数据+可选文件的代码:
var result = await Request.Content.ReadAsMultipartAsync();
var requestJson = await result.Contents[0].ReadAsStringAsync();
var request = JsonConvert.DeserializeObject<MyRequestType>(requestJson);
if (result.Contents.Count > 1)
{
var fileByteArray = await result.Contents[1].ReadAsByteArrayAsync();
...
}
Run Code Online (Sandbox Code Playgroud)
它非常简洁,你可以在这样的请求中组合不同类型的数据.
编辑:如何发送此请求的示例:
let serialisedJson = JSON.stringify(anyObject);
let formData = new FormData();
formData.append('initializationData', serialisedJson);
// fileObject is an instance of File
if (fileObject) {
// the 'jsonFile' name might cause some confusion:
// in this case, the uploaded file is actually a textfile containing json data
formData.append('jsonFile', fileObject);
}
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.open('POST', 'http://somewhere.com', true);
xhr.onload = function(e: any) {
if (e.target.status === 200) {
resolve(JSON.parse(e.target.response));
}
else {
reject(JSON.parse(e.target.response));
}
};
xhr.send(formData);
});
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式读取内容并获取所有文件信息(在我的示例图像中),而无需复制到本地磁盘:
public async Task<IHttpActionResult> UploadFile()
{
if (!Request.Content.IsMimeMultipartContent())
{
return StatusCode(HttpStatusCode.UnsupportedMediaType);
}
var filesReadToProvider = await Request.Content.ReadAsMultipartAsync();
foreach (var stream in filesReadToProvider.Contents)
{
// Getting of content as byte[], picture name and picture type
var fileBytes = await stream.ReadAsByteArrayAsync();
var pictureName = stream.Headers.ContentDisposition.FileName;
var contentType = stream.Headers.ContentType.MediaType;
}
}
Run Code Online (Sandbox Code Playgroud)