首页 > 解决方案 > 将 .webp 重命名为 .jpg 时,Fromstream 流异常“参数无效”

问题描述

我使用以下代码将上传的图像保存到 ASP.Net Core 3.1 Web 应用程序中的 wwwroot 目录:

 var files = HttpContext.Request.Form.Files;
 int filesCount = files.Count;

 //Some codes here
 //Check for type of file: only jpg and png are accepted
 for (int i = 0; i < filesCount; i++)
 {
     string extension = Path.GetExtension(files[i].FileName).ToLower();
     if (extension == ".jpg" || extension == ".png")       
      {//Some codes here}
 }

 //some codes here
 
 for (int i = 0; i < filesCount; i++)
 {
     using (var stream = files[i].OpenReadStream())
     {
         try
         {
            using (var img = Image.FromStream(stream))
           {
              img.ScaleAndCrop(500, 500)                  
              .SaveAs($"wwwroot\\images\\items\\" + fileName + i + ".jpg", 45);
           }
         }
         catch (Exception message)
         {
            string exceptionMessgae = message.ToString();
         }
     }
 }

它工作正常,当客户端用户上传.webp图像时,代码拒绝正确保存图像,但问题是当客户端手动将 a 重命名Image1.webpImage1.jpg然后上传时,系统接受 .jpg 文件并继续但就using (var img = Image.FromStream(stream)可以了通过并"parameter is not valid"出现异常消息并且图像不保存。我不明白,如果重命名上传的图像不是 .jpg 那为什么它传递给保存代码,如果是 .jpg 为什么它不能被保存。

更多信息:即使我将文件重命名test.dlltest.jpg文件并上传,问题仍然存在。我需要代码来防止接受改名和假.jpg的。

标签: c#asp.net-core

解决方案


(真实)JPG 文件的前三个字节显然是(十六进制)FF D8 FF。

这也被称为“幻数”,对于PNG 来说更长:89 50 4e 47 0d 0a 1a 0a

GetMimeType 只是使用(可能重命名的)扩展在内部数据库(可能不完整)中查找 mimetype。Windows 资源管理器也仅使用扩展名来获取要显示的文件类型。

要读取该幻数,您不必将整个文件读入字节数组,只需将前几个字节读入即可。


推荐阅读