Asp.net Core rc2 web api 文件上传

4
需要帮助,我该如何在ASP.NET Core 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 core rc2中,如果在mvc中使用IFromFile而没有使用ajax,则可以正常工作,但是我们使用js+ajax+webapi。


这是针对Web Api 2而不是Asp.Net Core的。 - trueboroda
3个回答

12

我曾经遇到过同样的问题,解决方法如下:

[HttpPost]
public async Task<IActionResult> PostFile()
{   
   //Read all files from angularjs FormData post request
 var files = Request.Form.Files;
  .....
}

如果您需要完整的解决方案,您也可以查看我的问题


在 ASP.NET Core 1.1.1 中实际上! - Ilya Chumakov

6
在我的asp.net core程序中,我更改了控制器方法为:
[HttpPost]
public async Task<IActionResult> Upload(ICollection<IFormFile> file)
{
     ...       
}

我已添加了[HttpPost]注释,并使用了新的IFormFile接口。


1

这对我有用。使用“Request.Form.Files”。适用于ASP.NET Core。

    [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 });
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接