Завантажте архів у веб-додаток 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    }

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.