Télécharger l'archive sur l'application Web ASP.NET
Scénario
Cet article vous fournit un exemple d’utilisation des bibliothèques Aspose pour la décompression d’archives et le traitement d’images pour l’application Web ASP.NET. Le cas d’utilisation : le visiteur du site télécharge une archive zip contenant des images sur une application Web pour les faire pivoter selon un angle spécifique. Les images pivotées seront affichées sur la même page Web en réponse.
Préparer l’application Web ASP.NET
À l’aide de Visual Studio, composez une application Web ASP.NET Core simple avec Razor Pages.
À l’aide de NuGet Package Manager, référez-vous à deux packages pour votre projet :
Aspose.Zip pour la décompression et
Aspose.Imaging pour le traitement d’image.
Recherchez la page « Index.cshtml » dans votre Explorateur de solutions. Maintenant, ajoutez un formulaire à cette page avec l’attribut enctype="multipart/form-data"
dans la balise <form>
. Il fallait transférer le fichier vers le serveur Web. Ensuite, ajoutez deux champs de saisie - un de type « fichier » pour l’archive téléchargée, un autre de type « numéro » pour spécifier l’angle de rotation.
Voici le balisage HTML complet du formulaire :
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>
Certains attributs de validation ont également été ajoutés.
Traitement des demandes des utilisateurs
Ainsi, l’utilisateur fournit des images à l’archive zip et soumet le formulaire. Comment gérer sa requête côté serveur ? En utilisant l’approche ASP.NET, nous devons composer une méthode OnPost
appropriée pour la source Index.cshtml.cs
. Dans cette méthode, nous extrayons
l’archive zip en utilisant
le constructeur approprié, puis faisons pivoter chaque image. Voici le brouillon de la méthode :
1public void OnPost (IFormFile uploadedFile, int rotateDegree) {
2 using (Archive archive = new Archive(uploadedFile.OpenReadStream())) {
3 foreach (entrée ArchiveEntry dans archive.Entries) {
4 // Extrait l'image et la fait pivoter.
5 }
6 }
7}
Faire pivoter les images
Nous utilisons la bibliothèque Aspose.Imaging pour faire pivoter une image selon un angle particulier sur l’angle de vol en suivant cette instruction. L’extrait du code de rotation :
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 }
Modèle de page et rendu d’image
Nous devons stocker des octets d’images traitées dans le modèle de page pour restituer ces images. Ajoutez la propriété public List<byte[]> ImageBytes { get; ensemble privé; }
à IndexModel
.
Nous remplissons cette liste avec les octets d’image traités. Pour les afficher sur la page Web, nous utilisons
data URI Nous devons convertir les octets de l’image en chaîne base64.
Voici un code Razor de rendu sur Index.cshtml
1@{
2if (Model.ImageBytes != null && Model.ImageBytes.Count > 0) {
3 <h4>Images pivotées :</h4>
4 foreach (image octet[] dans Model.ImageBytes) {
5 <img src="data:image;base64,@Convert.ToBase64String(image)" width="150"/>
6 }
7 }
8}
Réponse finale
Alors, mettez tout cela ensemble. Chaque entrée de l’archive a été décompressée, puis une image composée à partir de ces octets, et enfin pivotée.
Nous ne validons pas le fichier utilisateur dans cet exemple. Dans les applications réelles, vous devez vérifier une archive téléchargée et son contenu.
Vous trouverez ci-dessous la méthode finale 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 }