使用 PostAsync 从 HTML 表单上传文件
Upload a File from HTML form using PostAsync
我只想使用 WebAPI 将文件上传到服务器。我想在我的 MVC HomeController 中调用 WebApi。当我直接使用 WebAPI 时,它可以完美地上传文件,但是当我想使用 PostAsync 在我的控制器中调用 WebAPI 时,由于某种原因它不会将文件发送到 api。
这是我的 MVC 控制器中的操作:
public async Task<ActionResult> Upload(HttpPostedFileBase upload)
{
ViewBag.Title = "Upload Files";
if (upload != null && upload.ContentLength > 0)
{
var client = new HttpClient();
string FullUrl = Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host + ":" + Request.Url.Port + "/api/values";
StringContent httpcontent = new StringContent(upload.FileName);
var response = await client.PostAsync(FullUrl, httpcontent);
var result = await response.Content.ReadAsAsync<HttpResponseMessage>();
}
return View();
}
这是 .cshtml 文件:
<form name="form1" method="post" action="/Home/Upload" enctype="multipart/form-data">
<div>
<label for="upload">Choose a File</label>
<input name="upload" type="file" />
</div>
<div>
<input type="submit" value="Submit" />
</div>
最后这是 WebApi 控制器:
[HttpPost]
public HttpResponseMessage PostFile()
{
HttpResponseMessage result = null;
var httpRequest = HttpContext.Current.Request;
if (httpRequest.Files.Count > 0)
{
foreach (string file in httpRequest.Files)
{
var postedFile = httpRequest.Files[file];
var filePath = HttpContext.Current.Server.MapPath("~/Files/" + postedFile.FileName);
postedFile.SaveAs(filePath);
}
result = Request.CreateResponse(HttpStatusCode.Created);
}
else
{
result = Request.CreateResponse(HttpStatusCode.BadRequest);
}
return result;
}
当表单内容post时,它设置multipart/form-data请求的内容类型。
您可以尝试将请求内容类型明确设置为 multipart/form-data。
var requestContent = new MultipartFormDataContent();
var fileContent = new StreamContent(upload.InputStream);
fileContent.Headers.ContentType = upload.ContentType;
requestContent.Add(fileContent, upload.FileName, upload.FileName);
client.PostAsync(url, requestContent);
我只想使用 WebAPI 将文件上传到服务器。我想在我的 MVC HomeController 中调用 WebApi。当我直接使用 WebAPI 时,它可以完美地上传文件,但是当我想使用 PostAsync 在我的控制器中调用 WebAPI 时,由于某种原因它不会将文件发送到 api。
这是我的 MVC 控制器中的操作:
public async Task<ActionResult> Upload(HttpPostedFileBase upload)
{
ViewBag.Title = "Upload Files";
if (upload != null && upload.ContentLength > 0)
{
var client = new HttpClient();
string FullUrl = Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host + ":" + Request.Url.Port + "/api/values";
StringContent httpcontent = new StringContent(upload.FileName);
var response = await client.PostAsync(FullUrl, httpcontent);
var result = await response.Content.ReadAsAsync<HttpResponseMessage>();
}
return View();
}
这是 .cshtml 文件:
<form name="form1" method="post" action="/Home/Upload" enctype="multipart/form-data">
<div>
<label for="upload">Choose a File</label>
<input name="upload" type="file" />
</div>
<div>
<input type="submit" value="Submit" />
</div>
最后这是 WebApi 控制器:
[HttpPost]
public HttpResponseMessage PostFile()
{
HttpResponseMessage result = null;
var httpRequest = HttpContext.Current.Request;
if (httpRequest.Files.Count > 0)
{
foreach (string file in httpRequest.Files)
{
var postedFile = httpRequest.Files[file];
var filePath = HttpContext.Current.Server.MapPath("~/Files/" + postedFile.FileName);
postedFile.SaveAs(filePath);
}
result = Request.CreateResponse(HttpStatusCode.Created);
}
else
{
result = Request.CreateResponse(HttpStatusCode.BadRequest);
}
return result;
}
当表单内容post时,它设置multipart/form-data请求的内容类型。 您可以尝试将请求内容类型明确设置为 multipart/form-data。
var requestContent = new MultipartFormDataContent();
var fileContent = new StreamContent(upload.InputStream);
fileContent.Headers.ContentType = upload.ContentType;
requestContent.Add(fileContent, upload.FileName, upload.FileName);
client.PostAsync(url, requestContent);