C# 支持.NET核心Web API中的图像文件上载
我正在开发一个带有.NETCore的WebAPI,我需要允许客户端上传文件列表(主要是图像)并将其保存到服务器 问题是,当上传图像时,我试图从保存图像的文件夹中打开图像,图像似乎已损坏,其大小与初始图像不一样 这是我的控制器的代码:C# 支持.NET核心Web API中的图像文件上载,c#,file-upload,.net-core,image-uploading,asp.net-core-webapi,C#,File Upload,.net Core,Image Uploading,Asp.net Core Webapi,我正在开发一个带有.NETCore的WebAPI,我需要允许客户端上传文件列表(主要是图像)并将其保存到服务器 问题是,当上传图像时,我试图从保存图像的文件夹中打开图像,图像似乎已损坏,其大小与初始图像不一样 这是我的控制器的代码: [Route("api/TestUpload")] [Consumes("multipart/form-data")] public class TestUploadController : Controller { private readonly IHo
[Route("api/TestUpload")]
[Consumes("multipart/form-data")]
public class TestUploadController : Controller
{
private readonly IHostingEnvironment _env;
private readonly ApplicationContext _context;
public TestUploadController(ApplicationContext context, IHostingEnvironment env)
{
_context = context;
_env = env;
}
// GET: /<controller>/
public IActionResult Index()
{
return View();
}
[HttpPost("upload")]
public async Task<IActionResult> Post([FromForm]IList<IFormFile> files)
{
long size = files.Sum(f => f.Length);
var uploads = Path.Combine(_env.WebRootPath, "uploads");
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
var filePath = Path.Combine(uploads, formFile.FileName);
using (var fileStream = new FileStream(Path.Combine(uploads, formFile.FileName), FileMode.Create))
{
await formFile.CopyToAsync(fileStream);
fileStream.Flush();
}
}
}
return Ok(new { size });
}
}
[路由(“api/TestUpload”)]
[使用(“多部分/表单数据”)]
公共类TestUploadController:控制器
{
私有只读IHostingEnvironment;
私有只读应用程序上下文\u上下文;
公共TestUploadController(ApplicationContext上下文,IHostingEnvironment环境)
{
_上下文=上下文;
_env=env;
}
//获取://
公共IActionResult索引()
{
返回视图();
}
[HttpPost(“上传”)]
公共异步任务发布([FromForm]IList文件)
{
long size=files.Sum(f=>f.Length);
var uploads=Path.Combine(_env.WebRootPath,“uploads”);
foreach(文件中的var formFile)
{
如果(formFile.Length>0)
{
var filePath=Path.Combine(上传,formFile.FileName);
使用(var fileStream=newfilestream(Path.Combine(uploads,formFile.FileName),FileMode.Create))
{
等待formFile.CopyToAsync(fileStream);
Flush();
}
}
}
返回Ok(新的{size});
}
}
唯一似乎可以上传和保存的文件是文本和html文件。我试着用一个文件而不是一个列表,同样的事情
我尝试了几种代码变体,但似乎都不起作用,我可能做错了什么,但我就是搞不清楚是什么
下面是使用高级REST客户端进行的测试的屏幕截图:
下面是我所说的“它似乎被破坏了”:
感谢您的帮助 这里有两个问题可能会引起混淆:
Content-Length: 95267
Content-Type: image/png
将正确的媒体格式属性添加到WebAPI控制器类中,以支持图像格式:
如果出现任何其他问题或需要支持现成的图像格式,请创建自定义
媒体格式化程序
CLA,从例如BufferedMediaFormat
派生,并在项目中使用它。在消息开头添加字节计数。接收端提取字节计数并读取,直到接收到整个消息。Filestream当您同步读取文件时,windows操作系统会在文件末尾设置null。在异步读取文件时,没有阻塞,因此立即返回。在这种情况下,等待没有任何作用。奇怪的是,因为您的图像显示输入的大小太小了。你是如何上传这个文件的?@jdweng,但我试过使用formFile.CopyTo(fileStream)代码>而不是异步执行,但没有任何更改。@Stefan是的,据我所知,我没有超出文件大小限制。我正在使用先进的REST客户端,并选择多部分/表单数据
作为内容类型
。我没有发现您的代码中有任何明显的错误<代码>刷新
是不必要的,可以删除,但我不认为这是问题的根源。您确定这些文件一开始就很好吗?我无法添加多个[消费]
注释。
[Route("api/TestUpload")]
[Consumes("multipart/form-data")]
[Consumes("image/jpg")]
[Consumes("image/png")]
[Consumes("image/gif")]
public class TestUploadController : Controller
{
}