【问题标题】:Support image file upload in .NET Core Web API支持在 .NET Core Web API 中上传图片文件
【发布时间】:2018-08-19 20:22:52
【问题描述】:

我正在使用 .Net Core 开发 Web API,我需要允许客户端上传文件列表(主要是图像)并将它们保存到服务器。

问题是当图片上传时,我尝试从保存它的文件夹中打开它,它似乎已损坏,并且它的大小与最初的不一样。

这是我的控制器的代码:

[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 });
    }
}

似乎可以正常上传和保存的唯一文件是文本和 html 文件。我尝试过使用单个文件而不是列表,同样的事情。

我尝试了几种代码变体,但似乎都不起作用,我可能做错了什么,但我就是不知道它是什么。

这是一个高级 REST 客户端测试的屏幕截图: ARC screenshot

这就是我所说的“它似乎已损坏”的意思:Windows Photo Viewer screenshot

感谢任何帮助!

【问题讨论】:

  • 在消息的开头添加一个字节数。在接收端提取字节计数并读取,直到接收到整个消息。当您从文件同步读取文件流时,Windows 操作系统会在文件末尾放置一个空值。当您从文件异步读取时,没有阻塞,因此您立即返回。在这种情况下,await 什么都不做。
  • 奇怪,因为您的图片表明传入的size 很小。你是如何上传这个文件的?
  • @jdweng 但我试过只使用formFile.CopyTo(fileStream); 而不是异步执行,但没有任何变化。
  • @Stefan 是的,据我所知,我不会超出文件大小限制。我正在使用高级 REST 客户端,并选择 multipart/form-data 作为 content type
  • 我在您的代码中没有发现任何明显错误。 Flush 是不必要的,可以删除,但我认为这不会导致问题。您确定这些文件可以开始使用吗?

标签: c# file-upload .net-core image-uploading asp.net-core-webapi


【解决方案1】:

这里有两个问题可能会引起混淆:

  1. 服务支持的媒体类型定义了可以正确上传到服务器的数据格式。

  2. 上传的图像格式与源计算机上存储的图像不同,因为您的 WebAPI 不支持任何图像媒体格式。

如果您的 WebAPI 客户端 HTTP POST 消息包含有效负载 - 图像,则在 HTTP 标头中,Content-Type 指定消息正文的格式。这告诉 Web API 如何解析消息正文的内容。例如,如果发送到 API 的 HTTP 发布消息包含 PNG 图像,则 POST 请求可能具有以下标头:

Content-Length: 95267
Content-Type: image/png

为您的 WebAPI 控制器类添加正确的媒体格式属性应支持其中指示的图像格式:

[Route("api/TestUpload")]
[Consumes("multipart/form-data")]
[Consumes("image/jpg")]
[Consumes("image/png")]
[Consumes("image/gif")]
public class TestUploadController : Controller
{
}

如果有任何其他问题或需要支持现成不可用的图像格式,请创建自定义 MediaFormatter 类,例如派生自 BufferedMediaFormatter 并在您的项目中使用它。

【讨论】:

  • 我无法添加多个[Consumes] 注释。
猜你喜欢
  • 2020-01-14
  • 2019-10-29
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 2020-01-13
  • 2020-05-27
相关资源
最近更新 更多