文件格式验证



如何在Asp.net Core项目中编写代码来获得照片文件的格式,并且只接受jpg格式而不接受任何其他格式?我写的代码是这样的,但它不起作用

pro.ItemId = pro.Id;

if (Product.Picture?.Length > 0)
{
string filepath = Path.Combine(Directory.GetCurrentDirectory(),
"wwwroot",
"image",
pro.Id + Path.GetExtension(Product.Picture.FileName));
// string Image = @"filepath";
string Format = Path.GetExtension(filepath);
if (Format == "jpg")
{
using (var stream = new FileStream(filepath, FileMode.Create))
{
Product.Picture.CopyTo(stream);
}
}
else
{
ModelState.AddModelError("Picture", "لطفا تصویر را با فرمت jpg انتخاب کنید.");
}
}

我想您误解了字符串插值。您可能想做string Image = $"{filepath}";而不是string Image = @"filepath";,但这与string Image = filepath;相同,并且您将创建第二个变量,该变量将保持与filepath相同的值。

相反,试着去掉那条线,只做string Format = Path.GetExtension(filepath);

您可以在控制器中检索上传的内容类型(MIME(并检查相应的格式

HttpFileCollection MyFileCollection = Request.Files;
for (int Loop1 = 0; Loop1 < MyFileCollection.Count; Loop1++)
{
if (MyFileCollection[Loop1].ContentType == "image/jpeg")
{
//...
}
}

来源:微软文档

您实际上可以通过读取字节流来检查字节签名,以验证它是jpg还是任何其他图像文件,它们以唯一的字节头开头。jpg文件以"FFD8";。

我确实有一个方法,涵盖了4种不同的图像扩展,并检查图像是否为jpg/png/bmp.gif;

public static bool ExtensionVerifier(string expectedExtension, IFormFile file)
{

var fileName = file.FileName.Split('.')[0];
var fileExtension = file.FileName.Split('.')[file.FileName.Split('.').Length-1];
var pExtension = expectedExtension.ToString().ToLower();

#region Byte_Signatures_of_ImageTypes
var ImageTypes = new Dictionary<string, string>();
ImageTypes.Add("FFD8", "jpg");
ImageTypes.Add("424D", "bmp");
ImageTypes.Add("474946", "gif");
ImageTypes.Add("89504E470D0A1A0A", "png");
#endregion

using (var signatureChecker = file.OpenReadStream())
{
signatureChecker.Seek(0, SeekOrigin.Begin);
var builder = new StringBuilder();
int byteHeader = ImageTypes.FirstOrDefault(img => img.Value == fileExtension).Key.Length;
for (int i = 0; i < byteHeader; i += 2)
{
string bit = signatureChecker.ReadByte().ToString("X2");
builder.Append(bit);
string builtHex = builder.ToString();
if (ImageTypes.ContainsKey(key: builtHex))
{
if (fileExtension == pExtension)
{
signatureChecker.Dispose();
return true;
}
}
}
return false;
}
}

最新更新