[英]C# How to post an entity with a file as form-data from HttpClient to API?
我有一个 ASP.NET 核心 API 接收这样的实体:
public class ChartDTO
{
public string Name { get; set; }
//public byte[] Image { get; set; }
public IFormFile Image { get; set; }
}
API controller 是:
[HttpPost]
[Route("[action]")]
public ActionResult Register([FromForm] ChartDTO dto) // Using IFormFile
{
if (dto.Image.Length > 0)
{
var filePath = Path.Combine("wwwroot\\Charts", dto.Name);
using (var fileStream = new FileStream(filePath, FileMode.Create))
{
try
{
dto.Image.CopyTo(fileStream);
return Ok(new { status = true, message = "Chart posted Successfully" });
}
catch (Exception)
{
return BadRequest();
}
}
}
return BadRequest();
}
它从 Postman (Body = form-data,Name = "DEV.png",Image = the file)很好用,但我不知道如何在控制台应用程序中复制它。 发现了很多类似的问题,但他们似乎都只专注于上传单个文件,我需要一个实体。 Base64 字节数组是图像的一个选项,但我也无法让它工作。 非常感谢任何帮助。
蒂亚! 丹尼斯
试试这个,它对我来说很好用。 您必须定义一个 MultipartFormDataContent
var requestContent = new MultipartFormDataContent();
var imageContent = new ByteArrayContent(ImageData);
requestContent.Add(imageContent, "image", "image.jpg");
await client.PostAsync(url, requestContent);
睡了一会儿,我意识到在这个项目的最后,我将无法使用 IFormFile,因为必须从 MetaTrader 4 加载和发送图像。因此我必须使用 byte[] 代替,这意味着整个解决方案最终是:
DTO:
public class ChartDTO
{
public string Name { get; set; }
public byte[] Image { get; set; }
}
Controller:
[HttpPost]
[Route("[action]")]
public ActionResult Register([FromBody] ChartDTO dto)
{
if (dto.Image.Length > 0)
{
string filePath = Path.Combine(env.WebRootPath + "\\Charts\\"+ dto.Name);
try
{
using (FileStream binaryFileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
{
binaryFileStream.Write(dto.Image, 0, dto.Image.Length);
}
return Ok();
}
catch (Exception)
{
return BadRequest();
}
}
return BadRequest();
}
应用程序:
public static void UploadScreenshot(string accountName)
{
//string url = "https://localhost:44369/api/Charts/Register";
string url = LocalItems.baseURL + LocalItems.chartsURL;
string fileName = accountName + ".png";
var filePath = Path.Combine(LocalItems.DataFolder + "\\MQL4\\Files\\", fileName);
if (File.Exists(filePath))
{
ChartDTO dto = new ChartDTO();
dto.Name = fileName;
dto.Image = File.ReadAllBytes(filePath);
var json = JsonConvert.SerializeObject(dto);
using (var client = new HttpClient())
{
// By calling .Result you are synchronously reading the result
var response = client.PostAsync(url, new StringContent(json, Encoding.UTF8, "application/json")).Result;
}
}
}
很抱歉浪费您的时间。
再丹尼斯
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.