Asp.net 核心 rc2 web api 文件上传
Asp.net Core rc2 web api file upload
需要帮助,如何在 ASP.NET 核心 rc2 web api 中上传文件。
当我使用 asp.net 4.5 时,它使用以下代码:
@{
ViewBag.Title = "Home Page";
}
<div>
<input type="file" name="upload" id="uploadFile" /><br />
<button id="submit">Загрузить</button>
</div>
@section scripts{
<script type="text/javascript">
$('#submit').on('click', function (e) {
e.preventDefault();
var files = document.getElementById('uploadFile').files;
if (files.length > 0) {
if (window.FormData !== undefined) {
var data = new FormData();
for (var x = 0; x < files.length; x++) {
data.append("file" + x, files[x]);
}
$.ajax({
type: "POST",
url: 'api/values/post',
contentType: false,
processData: false,
data: data,
success: function (result) {
alert(result);
},
error: function (xhr, status, p3) {
alert(status);
}
});
} else {
alert("Браузер не поддерживает загрузку файлов HTML5!");
}
}
});
}
public class ValuesController : ApiController
{
public async Task<IHttpActionResult> Post()
{
if (!Request.Content.IsMimeMultipartContent())
{
return BadRequest();
}
var provider = new MultipartMemoryStreamProvider();
// путь к папке на сервере
string root = System.Web.HttpContext.Current.Server.MapPath("~/Files/");
await Request.Content.ReadAsMultipartAsync(provider);
foreach (var file in provider.Contents)
{
var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
byte[] fileArray = await file.ReadAsByteArrayAsync();
using (System.IO.FileStream fs = new System.IO.FileStream(root + filename, System.IO.FileMode.Create))
{
await fs.WriteAsync(fileArray, 0, fileArray.Length);
}
}
return Ok("файлы загружены");
}
}
现在,在 asp.net 核心 rc2 中它不起作用,如果在没有 ajax 的情况下在 mvc 中使用 IFromFile 它可以工作,但我们使用 js+ajax+webapi
在我的 asp.net 核心程序中,我将控制器方法更改为
[HttpPost]
public async Task<IActionResult> Upload(ICollection<IFormFile> file)
{
...
}
我添加了 [=11th=] 注释并使用了新的 IFormFile
界面。
我遇到了同样的问题,我是这样解决的:
[HttpPost]
public async Task<IActionResult> PostFile()
{
//Read all files from angularjs FormData post request
var files = Request.Form.Files;
.....
}
如需完整解决方案,您还可以查看
这对我有用。使用 "Request.Form.Files"。适用于 ASP.NET 核心。
[HttpPost]
[Route("UploadFiles")]
public async Task<IActionResult> Post()
{
var files = Request.Form.Files;
long size = files.Sum(f => f.Length);
// full path to file in temp location
var filePath = Path.GetTempFileName();
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
using (var stream = new FileStream(filePath, FileMode.Create))
{
await formFile.CopyToAsync(stream);
}
}
}
// process uploaded files
// Don't rely on or trust the FileName property without validation.
return Ok(new { count = files.Count, size, filePath });
}
需要帮助,如何在 ASP.NET 核心 rc2 web api 中上传文件。 当我使用 asp.net 4.5 时,它使用以下代码:
@{
ViewBag.Title = "Home Page";
}
<div>
<input type="file" name="upload" id="uploadFile" /><br />
<button id="submit">Загрузить</button>
</div>
@section scripts{
<script type="text/javascript">
$('#submit').on('click', function (e) {
e.preventDefault();
var files = document.getElementById('uploadFile').files;
if (files.length > 0) {
if (window.FormData !== undefined) {
var data = new FormData();
for (var x = 0; x < files.length; x++) {
data.append("file" + x, files[x]);
}
$.ajax({
type: "POST",
url: 'api/values/post',
contentType: false,
processData: false,
data: data,
success: function (result) {
alert(result);
},
error: function (xhr, status, p3) {
alert(status);
}
});
} else {
alert("Браузер не поддерживает загрузку файлов HTML5!");
}
}
});
}
public class ValuesController : ApiController
{
public async Task<IHttpActionResult> Post()
{
if (!Request.Content.IsMimeMultipartContent())
{
return BadRequest();
}
var provider = new MultipartMemoryStreamProvider();
// путь к папке на сервере
string root = System.Web.HttpContext.Current.Server.MapPath("~/Files/");
await Request.Content.ReadAsMultipartAsync(provider);
foreach (var file in provider.Contents)
{
var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
byte[] fileArray = await file.ReadAsByteArrayAsync();
using (System.IO.FileStream fs = new System.IO.FileStream(root + filename, System.IO.FileMode.Create))
{
await fs.WriteAsync(fileArray, 0, fileArray.Length);
}
}
return Ok("файлы загружены");
}
}
现在,在 asp.net 核心 rc2 中它不起作用,如果在没有 ajax 的情况下在 mvc 中使用 IFromFile 它可以工作,但我们使用 js+ajax+webapi
在我的 asp.net 核心程序中,我将控制器方法更改为
[HttpPost]
public async Task<IActionResult> Upload(ICollection<IFormFile> file)
{
...
}
我添加了 [=11th=] 注释并使用了新的 IFormFile
界面。
我遇到了同样的问题,我是这样解决的:
[HttpPost]
public async Task<IActionResult> PostFile()
{
//Read all files from angularjs FormData post request
var files = Request.Form.Files;
.....
}
如需完整解决方案,您还可以查看
这对我有用。使用 "Request.Form.Files"。适用于 ASP.NET 核心。
[HttpPost]
[Route("UploadFiles")]
public async Task<IActionResult> Post()
{
var files = Request.Form.Files;
long size = files.Sum(f => f.Length);
// full path to file in temp location
var filePath = Path.GetTempFileName();
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
using (var stream = new FileStream(filePath, FileMode.Create))
{
await formFile.CopyToAsync(stream);
}
}
}
// process uploaded files
// Don't rely on or trust the FileName property without validation.
return Ok(new { count = files.Count, size, filePath });
}