我想檢查該檔案是否是可以顯示的實際 .png/.jpg 檔案(例如,不是將檔案擴展名更改為 .png 的 .txt 檔案)。我還想檢查影像的寬度和高度是否在有效范圍內。我怎樣才能做到這一點?
[HttpPost]
[ValidateAntiForgeryToken]
[Authorize]
public async Task<IActionResult> Create(IFormFile image)
{
// validate image
}
uj5u.com熱心網友回復:
首先,不要嘗試System.Drawing在 .NET Core 應用程式中使用。它已被棄用,無論如何只能在 Windows 上運行。MSDN 檔案本身建議改用 ImageSharp 或 SkiaSharp。
影像檔案以標識檔案格式的位元組開頭。您必須至少讀取檔案的一些內容才能讀取影像大小、解析度等影像元資料。您可以使用ImageSharp 的識別方法來僅讀取格式和影像屬性,而無需加載整個影像。
您可以使用IFormFile.OpenReadStream讀取上傳檔案的內容。
using var stream=image.OpenReadStream();
try
{
var imageInfo=Image.Identify(stream, out var format);
if(imageInfo!=null)
{
var formatName=format.Name;
var width=imageInfo.Width;
var height=imageInfo.Height;
}
}
catch(InvalidImageContentException exc)
{
//Invalid content ?
}
該format引數是一個IImageFormat值,其中包含有關影像格式的資訊,包括其名稱和 mime 型別。
回傳的IImageInfo物件包含影像尺寸、像素型別、解析度等。
null方法檔案解釋說,如果沒有找到合適的解碼器,則回傳值:
如果找不到合適的資訊檢測器,則 IImageInfo 或 null。
但是如果內容無效會拋出例外:
InvalidImageContentException 影像包含無效內容。
在不對此進行測驗的情況下,我假設文本檔案將生成一個null但只有 GIF 標頭而沒有有效內容的檔案將導致例外。
您可以使用 ImageSharp 調整影像大小或將其轉換為另一種格式。在這種情況下,僅加載元資料是不夠的。您可以使用Load從流中加載影像,檢測其格式,然后對其進行操作。
using var stream=image.OpenReadStream();
var image=Image.Load(stream, out var format);
var formatName=format.Name;
if (notOk(formatName,image.Height,image.Width))
{
using var outStream=new MemoryStream();
image.Mutate(x => x.Resize(desiredWidth, desiredHeight));
image.SaveAsPng(outStream);
outStream.Position=0;
//Store the contents of `outStream`
}
uj5u.com熱心網友回復:
檢查檔案是否有已知的標頭。(此答案中也提到了來自鏈接的資訊)
PNG 檔案的前 8 個位元組始終包含以下(十進制)值:137 80 78 71 13 10 26 10
您還可以檢查Path.GetExtension 方法
這是一個簡單的示例:
public static readonly List<string> ImageExtensions = new List<string> { ".JPG", ".JPE", ".BMP", ".GIF", ".PNG" };
private void button_Click(object sender, RoutedEventArgs e)
{
var folder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
var files = Directory.GetFiles(folder);
foreach(var f in files)
{
if (ImageExtensions.Contains(Path.GetExtension(f).ToUpperInvariant()))
{
// process image
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/452624.html
