在Web API中上传单个文件

时间:2018-08-01 11:49:28

标签: c# postman asp.net-core-webapi

我正在使用此代码在Web API中上传文件。但是我发布的文件显示为Null。可能是因为代码期望邮递员中有多个文件。我需要通过邮递员而不是文件列表来更新单个文件。我正在共享代码。

[HttpPost]
[Route("Upload")]
public async Task<IActionResult> Upload(string targetIdStr, string feedType, 
    string contentType, string dateCreated, string description, List<IFormFile> files)

4 个答案:

答案 0 :(得分:0)

好吧,我将为您提供有关如何上传单个文件的真正的Web api控制器。下面的类是一个工作示例。只需将常量值替换为磁盘上的一个小文件即可。

using System.IO;
using Microsoft.AspNetCore.Mvc;

namespace WebApi.Controllers
{
    [Route("api/[controller]")]
    public class UploadController : Controller
    {
        private const string FILEPATH = @"c:\temp\demo.txt";

        [HttpGet]
        public IActionResult JsonObject()
        {
            var file = new FileInfo(FILEPATH);
            return new OkObjectResult(new FileClass()
            {
                Name = file.Name,
                Content = System.IO.File.ReadAllBytes(FILEPATH)
            });
        }

        [HttpPost]
        public IActionResult Index([FromBody] FileClass file)
        {
            return new NoContentResult();
        }
    }

    public class FileClass
    {
        public string Name { get; set; }
        public byte[] Content { get; set; }
    }
}

现在邮递员首先启动对get uri的呼叫 https://localhost:44382/api/upload

这将导致一个json答案,向您显示在我的情况下需要返回的json:

{
    "name": "demo.txt",
    "content": "dGVzdCBkYXRh"
}

现在在邮递员中选择选项post,然后在正文中选择raw,然后将获取的结果粘贴到其中并启动它。 在调试时,您现在将看到json对象已到达。 下面的屏幕截图显示了邮递员工作的证明: PostMan Example

答案 1 :(得分:0)

这里有很多问题。首先,动作方法签名仅适用于multipart/form-data编码的请求。为了接受类似JSON的内容,您必须将[FromBody]属性应用于一个参数,该参数只能执行一次。换句话说,如果您想接受类似JSON的内容,则需要一个包含所有这些参数的类,从而允许您使用[FromBody]属性将该类作为参数来接受。

此外,如果您希望接受类似JSON的内容,则不能绑定到IFormFile(或List<IFormFile>),因为它也仅适用于multipart/form-data编码请求。相反,您必须绑定到byte[],并且在客户端,需要将文件转换为base64编码的字符串以包含在JSON对象中。

如果您实际上打算仅接受multipart/form-data编码的请求(对于API来说是奇怪的),则只需确保帖子正文中的文件与正确的名称{{1 }},即已编入索引。

答案 2 :(得分:0)

不确定您如何创建客户端代码,我假设您在JavaScript中使用FormData? JavaScript API FormData

JS代码是这样的吗?

var form_data = new FormData();
form_data.append("file", "the file name");
form_data.append("fileID", file_id)
var sendMethod = './Upload';  //this is the url for post
$.ajax({
  type: "POST",
  url: sendMethod,
  data: form_data,
  dataType: 'JSON',
  contentType: false,
  processData: false,
  success: function (response) {
      //......
},
error: function (response) {
      //......
}
);

服务器端,

[HttpPost]
public Task<IActionResult> Upload(HttpPostedFileBase file, int fileID
{
  //......
}

我没有测试上面的代码,但是它应该可以工作,希望对您有所帮助。

答案 3 :(得分:0)

要上传一个文件,您需要更改以下操作:

        [HttpPost]
        [Route("Upload")]
        public async Task<IActionResult> Upload(string targetIdStr, string feedType,
  string contentType, string dateCreated, string description, IFormFile file)
        {
            return Ok();
        }

对于PostMan中的请求,请发送带有post->“将正文设置为form-data的请求,如下所示

enter image description here