Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Для сжатия изображений при загрузке на сервере в приложении ASP.NET MVC можно использовать стандартные классы из пространства имен System.Drawing, например, Image и Bitmap, и вручную проводить все масштабирование. Но можно также воспользоваться готовыми решениями. В частности библиотекой ImageResizer.
Чтобы добавить ее функциональность в проект, необходимо через NuGet добавить последовательно ряд пакетов:
ImageResizer.WebConfig ImageResizer.Plugins.DiskCache ImageResizer.Plugins.PrettyGifs
После добавления пакетов в файл конфигурации web.config добавляется определение модуля для работы с изображениями:
<modules> <add name="ImageResizingModule" type="ImageResizer.InterceptModule" /> </modules>
Тепер применим библиотеку при загрузке файла:
using ImageResizer; //........................... [HttpPost] public ActionResult Upload(HttpPostedFileBase upload) { if (upload != null) { var path = Server.MapPath("~/Files/"); upload.InputStream.Seek(0, System.IO.SeekOrigin.Begin); ImageBuilder.Current.Build( new ImageJob( upload.InputStream, path + upload.FileName, new Instructions("maxwidth=600&maxheight=600"), false, false)); } return RedirectToAction("Index"); }
Для создания нового изображения применяется метод ImageBuilder.Current.Build()
, который в качестве параметра принимает
объект ImageJob. Конструктор данного объекта принимает ряд перегруженных версий.
В данном случае первый параметр указывает на поток, который надо сохранить.
Второй параметр определяет полный путь к сохраняемому файлу, включая его имя.
Третий параметр задает инструкции сохранения. В чаcтности, инструкция "maxwidth=600&maxheight=600" задает максимальные размеры файла. И если размеры загружаемого файлы выходят за эти границы, то изображение должным образом масштабируется. В данном случае в качестве максимально допустимых размеров задаются ширина в 600 пикселей и высота также в 600 пикселей.
Четвертый булевый параметр задает, будет ли вызываться после использования объекта, представляющего изображение, метод Dispose ( если иточник изображения представляет объект IDisposable).
Пятый параметр задает добавление формата. Например, мы могли бы использовать следующую инструкцию:
"maxwidth=600&maxheight=600&format=jpg"
. И если данный параметр имел бы значение true
,
то после сжатия в имени файла после уже имеющегося раширения добавлялось бы расширение ".jpg", а само загруженное изображение
использовало бы формат jpg вне зависимости от того, какой формат у него был ранее.
Если необходимо создавать по несколько версий для каждого изображения: малый, средний и большой форматы (например, при показе эскизов отображать только изображения малого формата, а при загрузке изображения отдавать файл в большом формате), то в этом случае мы моем воспользоваться набором инструкций:
[HttpPost] public ActionResult Upload(HttpPostedFileBase upload) { if (upload != null) { var path = Server.MapPath("~/Files/"); // получаем расширение var ext = upload.FileName.Substring(upload.FileName.LastIndexOf(".") + 1); // создаем инструкции для различных версий var versions = new Dictionary<string, string>(); versions.Add("_small", "maxwidth=400&maxheight=400&format="+ext); versions.Add("_medium", "maxwidth=600&maxheight=600&format=" + ext); versions.Add("_large", "maxwidth=900&maxheight=900&format=" + ext); foreach (var suffix in versions.Keys) { upload.InputStream.Seek(0, System.IO.SeekOrigin.Begin); ImageBuilder.Current.Build( new ImageJob( upload.InputStream, path + upload.FileName.Remove(upload.FileName.LastIndexOf("."))+ suffix, new Instructions(versions[suffix]), false, true)); } } return RedirectToAction("Index"); }
В этом случае в папке для загруженных файлов появятся по три копии для каждого файла с именами: filename_large.ext, filename_medium.ext и filename_small.ext