Завантажте архів у веб-додаток ASP.NET
Сценарій
У цій статті наведено приклад використання бібліотек Aspose для декомпресії архіву та обробки зображень для веб-програми ASP.NET. Випадок користувача: відвідувач сайту завантажує zip-архів із зображеннями у веб-додаток, щоб повернути їх усі на певний кут. Повернуті зображення відображатимуться на тій же веб-сторінці у відповідь.
Підготуйте веб-додаток ASP.NET
Використовуючи Visual Studio, створіть просту веб-програму ASP.NET Core зі сторінками Razor.
Використовуючи диспетчер пакетів NuGet, використовуйте два пакети для свого проекту:
Aspose.Zip для декомпресії та
Aspose.Imaging для обробки зображень.
Знайдіть сторінку Index.cshtml
у своєму Solution Explorer. Тепер додайте форму до цієї сторінки з атрибутом enctype="multipart/form-data"
в тегу <form>
. Потрібно було передати файл на веб-сервер. Потім додайте два поля введення - одне типу file
для завантаженого архіву, інше типу number
для вказівки кута повороту.
Ось повна розмітка HTML для форми:
1<form method="post" enctype="multipart/form-data">
2 <span>Images archive: </span><input type="file" name="uploadedFile" required="required" />
3 <br />
4 <span>Rotation angle: </span><input type="number" value="30" min="0" max="360" name="rotateDegree" required="required" />
5 <br />
6 <input type="submit" value="Upload" />
7</form>
Також додано деякі атрибути перевірки.
Обробка запиту користувача
Отже, користувач надає zip-архів із зображеннями та надсилає форму. Як обробити його запит на стороні сервера? Використовуючи підхід ASP.NET, нам потрібно створити відповідний метод OnPost
для джерела Index.cshtml.cs
. У рамках цього методу ми розпаковуємо
zip-архів за допомогою
відповідного конструктора, а потім обертаємо кожне зображення. Ось чернетка методу:
1public void OnPost(IFormFile uploadedFile, int rotateDegree) {
2 використовуючи (архівний архів = новий архів(uploadedFile.OpenReadStream())) {
3 foreach (запис ArchiveEntry в archive.Entries) {
4 // Витягніть зображення та поверніть його.
5 }
6 }
7}
Обертати зображення
Ми використовуємо бібліотеку Aspose.Imaging, щоб обертати зображення під певним кутом під кутом польоту, дотримуючись цієї інструкції. Фрагмент коду ротації:
1 using (MemoryStream rotated = new MemoryStream())
2 {
3 using (RasterImage image = (RasterImage)Image.Load(extracted))
4 {
5 // Before rotation, the image should be cached for better performance
6 if (!image.IsCached)
7 image.CacheData();
8
9 image.Rotate(rotateDegree, true, Color.CornflowerBlue);
10 image.Save(rotated);
11 }
12 }
Модель сторінки та рендеринг зображення
Нам потрібно зберігати байти продовжених зображень у моделі сторінки, щоб відтворити ці зображення. Додайте властивість public List<byte[]> ImageBytes { get; приватний набір; }
до IndexModel
.
Ми заповнюємо цей список продовженими байтами зображень. Щоб показати їх на веб-сторінці, ми використовуємо
data URI. Нам потрібно перетворити байти зображення на рядок base64.
Ось код візуалізації Razor на Index.cshtml
1@{
2if (Model.ImageBytes != null && Model.ImageBytes.Count > 0) {
3 <h4>Повернуті зображення:</h4>
4 foreach (байт[] зображення в Model.ImageBytes) {
5 <img src="data:image;base64,@Convert.ToBase64String(image)" width="150"/>
6 }
7 }
8}
Завершення відповіді
Отже, з’єднайте все разом. Кожен запис архіву було розпаковано, потім із цих байтів було складено зображення та, нарешті, повернуто.
Ми не перевіряємо файл користувача в цьому зразку. У реальних програмах вам слід перевірити завантажений архів і його вміст.
Нижче наведено останній метод OnPost
.
1 public void OnPost(IFormFile uploadedFile, int rotateDegree)
2 {
3 ImageBytes = new List<byte[]>();
4
5 using (Archive archive = new Archive(uploadedFile.OpenReadStream()))
6 {
7 foreach (ArchiveEntry entry in archive.Entries)
8 {
9 if (entry.IsDirectory)
10 continue;
11
12 using (MemoryStream extracted = new MemoryStream())
13 {
14 entry.Open().CopyTo(extracted);
15 extracted.Seek(0, SeekOrigin.Begin);
16 using (MemoryStream rotated = new MemoryStream())
17 {
18 using (RasterImage image = (RasterImage)Image.Load(extracted))
19 {
20 if (!image.IsCached) // Before rotation, the image should be cached for better performance
21 image.CacheData();
22
23 image.Rotate(rotateDegree, true, Color.CornflowerBlue);
24 image.Save(rotated);
25 }
26
27 this.ImageBytes.Add(rotated.ToArray());
28 }
29 }
30 }
31 }
32 }