【问题标题】:Upload a single file in Web API在 Web API 中上传单个文件
【发布时间】:2019-01-08 23:33:33
【问题描述】:

我正在使用此代码在 Web API 中上传文件。但是我发布的文件显示为 Null。也许是因为代码在邮递员中需要多个文件。我需要通过邮递员上传单个文件,而不是文件列表。我正在分享代码。

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

【问题讨论】:

  • 客户端中的代码如何提交你的文件?

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


【解决方案1】:

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

        [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,如下所示

【讨论】:

    【解决方案2】:

    好的,我会给你一个真正的 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 对象已经到达。 下面的屏幕截图显示了它工作的邮递员证明:

    【讨论】:

    • Chris 写的内容突出了原始 web api 调用中所有不好的地方。请参阅他的回答,了解我这样做的原因,您应该正在创建您需要的任何内容。
    【解决方案3】:

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

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

    如果您实际上打算只接受multipart/form-data 编码请求(这对于API 来说很奇怪),那么您只需要确保帖子正文中的文件与files[] 的正确名称相关联,即索引。

    【讨论】:

      【解决方案4】:

      不确定如何创建客户端代码,我假设您在 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
      {
        //......
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 2020-07-10
        • 1970-01-01
        • 2019-12-14
        • 2014-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多