.net core 2.1 "POST" 使用 Postman 的 IFormFile - 应用程序在未读取整个请求正文的情况下完成
.net core 2.1 "POST" an IFormFile using Postman - the application completed without reading the entire request body
我正在开发 dotnet 核心 WebAPI 2.1,但找不到将图像发送到 Body 的方法。
控制器看起来像这样:
[HttpPost("api/image")]
public IActionResult Post([FromBody]IFormFile file)
{
var filePath = Path.GetTempFileName();
if (file.Length > 0)
{
return Ok();
}
return BadRequest();
}
这是我的邮递员电话:
此调用永远不会完成,因为 Kestrel
失败
我已经尝试使用 Consumes
[Consumes("application/json", "application/json-patch+json", "multipart/from-data")]
同样在邮递员中,我将 Content-Type 设置为 multipart/form-data
尝试这样做。在您现在使用的邮递员中使用相同的请求。这只是粗略的样板方法,但你明白了。
此外,不要忘记将您在邮递员中的请求的 headers 设置为:Content-Type:multipart/form-data
[HttpPost]
[Route("api/image")]
public async Task<IHttpActionResult> InsertNewMerchant()
{
// your form data is here
var formData = HttpContext.Current.Request.Form;
HttpFileCollection files = HttpContext.Current.Request.Files;
if (files.Count == 1)
{
// this is the file you need
var image = files[0];
// do something with the file
}
return StatusCode(System.Net.HttpStatusCode.Created);
}
我试过了,成功了。也许你忘了做某事。
删除 [FromBody] 属性。
[HttpPost("api/image")]
public IActionResult Post(IFormFile file)
{
var filePath = Path.GetTempFileName();
if (file.Length > 0)
{
return Ok();
}
return BadRequest();
}
Postman 会自动在正文部分附加正确的 Content-Type、select form-data 选项并添加您的文件使用 file 键。
应该可以。
似乎 Postman macOS application
有错误问题。当我使用 postman chrome extension
时,一切都按预期工作。
MacOS 应用程序
Chrome 分机
我知道这个问题已经得到解答,但您似乎已经决定采用解决方法。您的端点和 Postman 请求都没有问题,我遇到了同样的问题,为我的 OS 安装本机 Postman 解决了问题 https://www.getpostman.com/apps
我找到了 .Net Core 2.1/2.2 的解决方案 here
POST multiple files from POSTMAN
POST single file from POSTMAN
[HttpPost]
public async Task<IActionResult> UploadSingleFile([FromForm(Name = "file")] IFormFile file)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
var IDsList = new IDsList();
try
{
var id = SaveFile(file);
IDsList.Files.Add(new IDsList.FileInfo() { id = id, fileName = file.FileName });
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
return Content(JsonConvert.SerializeObject(IDsList), "application/json");
}
[HttpPost("UploadFiles")]
public async Task<IActionResult> UploadFiles([FromForm(Name = "files")] ICollection<IFormFile> files)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
//var files = Request.Form.Files?.GetFiles("files");
String message = String.Empty;
int filesCounter = 0;
var IDsList = new IDsList();
foreach (var file in files)
{
if (file.Length == 0)
message = message + $"errorDescription {file.FileName}\n";
try
{
var id = SaveFile(file);
IDsList.Files.Add(new IDsList.FileInfo() { id = id, fileName = file.FileName });
filesCounter++;
}
catch(Exception ex)
{
message = $"{message}{ex.Message}\n";
}
}
IDsList.message = $"Amount: {filesCounter}.\n{message}";
return Content(JsonConvert.SerializeObject(IDsList), "application/json");
}
我正在开发 dotnet 核心 WebAPI 2.1,但找不到将图像发送到 Body 的方法。
控制器看起来像这样:
[HttpPost("api/image")]
public IActionResult Post([FromBody]IFormFile file)
{
var filePath = Path.GetTempFileName();
if (file.Length > 0)
{
return Ok();
}
return BadRequest();
}
这是我的邮递员电话:
此调用永远不会完成,因为 Kestrel
失败
我已经尝试使用 Consumes
[Consumes("application/json", "application/json-patch+json", "multipart/from-data")]
同样在邮递员中,我将 Content-Type 设置为 multipart/form-data
尝试这样做。在您现在使用的邮递员中使用相同的请求。这只是粗略的样板方法,但你明白了。
此外,不要忘记将您在邮递员中的请求的 headers 设置为:Content-Type:multipart/form-data
[HttpPost]
[Route("api/image")]
public async Task<IHttpActionResult> InsertNewMerchant()
{
// your form data is here
var formData = HttpContext.Current.Request.Form;
HttpFileCollection files = HttpContext.Current.Request.Files;
if (files.Count == 1)
{
// this is the file you need
var image = files[0];
// do something with the file
}
return StatusCode(System.Net.HttpStatusCode.Created);
}
我试过了,成功了。也许你忘了做某事。 删除 [FromBody] 属性。
[HttpPost("api/image")]
public IActionResult Post(IFormFile file)
{
var filePath = Path.GetTempFileName();
if (file.Length > 0)
{
return Ok();
}
return BadRequest();
}
Postman 会自动在正文部分附加正确的 Content-Type、select form-data 选项并添加您的文件使用 file 键。
应该可以。
似乎 Postman macOS application
有错误问题。当我使用 postman chrome extension
时,一切都按预期工作。
MacOS 应用程序
Chrome 分机
我知道这个问题已经得到解答,但您似乎已经决定采用解决方法。您的端点和 Postman 请求都没有问题,我遇到了同样的问题,为我的 OS 安装本机 Postman 解决了问题 https://www.getpostman.com/apps
我找到了 .Net Core 2.1/2.2 的解决方案 here
POST multiple files from POSTMAN
POST single file from POSTMAN
[HttpPost]
public async Task<IActionResult> UploadSingleFile([FromForm(Name = "file")] IFormFile file)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
var IDsList = new IDsList();
try
{
var id = SaveFile(file);
IDsList.Files.Add(new IDsList.FileInfo() { id = id, fileName = file.FileName });
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
return Content(JsonConvert.SerializeObject(IDsList), "application/json");
}
[HttpPost("UploadFiles")]
public async Task<IActionResult> UploadFiles([FromForm(Name = "files")] ICollection<IFormFile> files)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
//var files = Request.Form.Files?.GetFiles("files");
String message = String.Empty;
int filesCounter = 0;
var IDsList = new IDsList();
foreach (var file in files)
{
if (file.Length == 0)
message = message + $"errorDescription {file.FileName}\n";
try
{
var id = SaveFile(file);
IDsList.Files.Add(new IDsList.FileInfo() { id = id, fileName = file.FileName });
filesCounter++;
}
catch(Exception ex)
{
message = $"{message}{ex.Message}\n";
}
}
IDsList.message = $"Amount: {filesCounter}.\n{message}";
return Content(JsonConvert.SerializeObject(IDsList), "application/json");
}