我正在使用此代码在Web API中上传文件。但是我发布的文件显示为Null。可能是因为代码期望邮递员中有多个文件。我需要通过邮递员而不是文件列表来更新单个文件。我正在共享代码。
[HttpPost]
[Route("Upload")]
public async Task<IActionResult> Upload(string targetIdStr, string feedType,
string contentType, string dateCreated, string description, List<IFormFile> files)
答案 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对象已到达。 下面的屏幕截图显示了邮递员工作的证明:
答案 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)