Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 支持.NET核心Web API中的图像文件上载_C#_File Upload_.net Core_Image Uploading_Asp.net Core Webapi - Fatal编程技术网

C# 支持.NET核心Web API中的图像文件上载

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

我正在开发一个带有.NETCore的WebAPI,我需要允许客户端上传文件列表(主要是图像)并将其保存到服务器

问题是,当上传图像时,我试图从保存图像的文件夹中打开图像,图像似乎已损坏,其大小与初始图像不一样

这是我的控制器的代码:

[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客户端进行的测试的屏幕截图:

下面是我所说的“它似乎被破坏了”


感谢您的帮助

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

  • 服务支持的媒体类型,定义可以正确上传到服务器的数据格式

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

  • 在WebAPI客户端HTTP POST消息包含有效负载映像的情况下,在HTTP头中,内容类型指定消息体的格式。这将告诉Web API如何解析消息体的内容。例如,如果API的HTTP post消息包含PNG图像,post请求可能具有以下标题:

    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
    {
    }