Ripropongo in maniera più ordinata un mio problema che ho postato nei giorni scorsi, in maniera un po' confusa.
Premetto che conosco pochissimo di .NET (lavora in ASP classico). Mi sono trovato di fronte all'esigenza di usare degli script in .NET e, grazie all'aiuto di alcuni utenti di questo forum, sono riuscito a portare a termine il tutto.
L'esigenza è:
1. fare l'upload di un file zip contenente solo immagini e decomprimere lo zip in una cartella sul server.
2. Creare le thumbanils delle immagini caricate e salvarle su una cartella del server.
Per il punto 1 non ho nessun problema, uso uno script che funziona egregiamente.
Per il punto 2 uso uno script che fa ciò che mi serve, anche se la qualità delle immagini ridimensionate non è alta. Da qualche giorno a questa parte, inoltre, lo script dà dei problemi, nel senso che a fronte di circa 200 immagini caricate (in un unico zip), una parte vengono ridimensionate nelle dimensioni corrette, altre invece, vengono ridimensionate molto più piccole.
Considerato che devo mettere mano allo script, pensavo di modificare lo script che si occupa del ridimensionamento ed usarne un altro che sto già usando in un altro sito e che ridimensiona le immagini con l'interpolazione bicubica, dando ottimi risultati.
Il mio problema è che l'altro script, tramite form fa l'upload di un'immagine alla volta e poi ridimensiona quell'immagine caricata.
Io vorrei fare l'upload e l'unzip col mio primo script (che funziona bene) e poi ridimensionare le immagini col nuovo script, dicendogli però di leggere le immagini in una particolare cartella del server e non cercando una particolare immagine appena "uploadata" tramite form.
Essendo davvero alle primissime armi con .NET, non sono in grado di modificare gli script per farli funzionare e mi servirebbe il supporto di qualcuno più esperto.
Questa è la porzione di codice che si occupa del salvataggio delle immagini decompresse dallo zip.
codice:
Sub BtnUp_Click(sender As Object, e As EventArgs)
dim strFile as string
strFile = inputFile.PostedFile.FileName
Dim strNomeFile as string
strNomeFile = System.IO.Path.GetFileName(strFile)
dim strPercorsoFileUpload,strPercorsoFileUnzip as string
strPercorsoFileUpload =server.mappath("/public/zip")
strPercorsoFileUnzip =server.mappath("/public/temp/unzip")
inputFile.PostedFile.SaveAs( strPercorsoFileUpload & "\" & strNomeFile)
scompatta(strPercorsoFileUnzip,strPercorsoFileUpload & "\" & strNomeFile,true,false)
End Sub
Per creare le thumbanils, vorrei usare lo script resonup.cs (che ho già testato e crea delle thumbnails di ottima qualità) che ho pubblicato qui sotto.
Ho una pagina che fa l'upload della singola immagine (e io vorrei sostituire a questo il mio scritp che fa l'upload dello zip) e che richiama uno script resonup.cs che si occupa della creazione delle thumbanils.
upload.aspx
codice:
<%@ Page Language="C#" LCID=1040 Debug="true" Trace="false" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Imaging" %>
<%@ Import Namespace="System.Drawing.Drawing2D" %>
<%@ Import Namespace="System.Globalization" %>
<%@ Import Namespace="System.Web.UI.HtmlControls" %>
<script Language="C#" runat="server" src="resonup.cs"/>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<link rel="stylesheet" type="text/css" href="/admin/style.css" />
<title><asp:Literal id="titletext" runat="server"/></title>
</head>
<body>
<form name="inviafile" id="inviafile" enctype="multipart/form-data" runat="server">
File:
<input id="File1" type="file" runat="Server"/>
<input id="Submit1" type="submit" value="Upload" runat="Server" onserverclick="SubmitButton_Click"/>
<asp:Label id="Status" runat="server"></asp:Label>
</form>
</body>
</html>
resonup.cs
codice:
void Page_Load(object sender, System.EventArgs e)
{
} // void Page_Load(object sender, System.EventArgs e)
bool IsImage(string fileName)
{
string ext = Path.GetExtension(fileName).ToLower();
bool imageFlag = false;
if (ext != null)
{
switch (ext)
{
case ".emf" :
case ".exif" :
case ".ico" :
case ".wmf" :
case ".png" :
case ".gif" :
case ".bmp" :
case ".tiff" :
case ".tif" :
case ".jpeg" :
case ".jpg" : imageFlag = true; break;
default: imageFlag = false; break; // Not a supported file type.
} // switch (ext)
} // if (ext != null)
else
imageFlag = false;
return imageFlag;
} // bool IsImage(string fileName)
void CalcolaAspectRatio(double orgWidth, double orgHeight, ref double newWidth, ref double newHeight)
{
// Se le dimensioni dell'immagine originale e quelle nuove coincidono non facciamo nulla.
if ((orgWidth == newWidth) && (orgHeight == newHeight)) return;
// Se le dimensioni originali dell'immagine sono minori di quelle desiderate lasciamo stare.
// In pratica NON facciamo l'ingrandimento della stessa.
if ((newWidth > orgWidth) && (newHeight > orgHeight))
{
newWidth = orgWidth;
newHeight = orgHeight;
return;
}
double resw = newWidth;
double resh = newHeight;
double aw = orgWidth / orgHeight; // fattore larghezza.
double ah = orgHeight / orgWidth; // fattore altezza.
// Se l'immagine è più piccola del Thumbnail forziamo le dimensioni di
// quest'ultimo alle dimensioni dell'immagine.
if (resw > orgWidth) resw = orgWidth;
if (resh > orgHeight) resh = orgHeight;
// Se le dimensioni dell'immagine e del Thumbnail corrispondono non facciamo nulla.
// quindi se l'immagine è quadrata...
if (orgWidth != orgHeight)
{
// Se l'immagine non è quadrata
// continuiamo a fare i nostri controlli per calcolarne le
// giuste dimensioni e quindi creare la nostra nuova immagine con
// l'aspectratio corretto.
// Se l'immagine è più larga che alta
if (orgWidth > orgHeight)
{
// L > H => L = tL
// La larghezza del TN sarà quella da noi stabilita
// quindi dobbiamo solo assegnarla.
resw = resw;
// L'altezza del TN invece dovrà essere ricalcolata
// in proporzione alla larghezza dell'immagine originale.
// L > H => tH = tL * (H / L)
resh = ah * resw;
} // if (tmporgWidth > tmporgHeight)
else
{
// Altrimenti se l'immagine è più alta
if (orgWidth < orgHeight)
{
// L < H => H = tH
// L'altezza del TN sarà quella da noi stabilita
// quindi dobbiamo solo assegnarla.
resh = resh;
// La larghezza del TN invece dovrà essere ricalcolata
// in proporzione alla altezza dell'immagine originale.
// L < H => tL = tH * (L / H)
resw = aw * resh;
} // if (orgWidth < orgHeight)
} // else
} // if (orgWidth != orgHeight)
// assegnamo i valori calcolati alle nostre due variabili ed il gioco è fatto.
newWidth = resw;
newHeight = resh;
} // void CalcolaAspectRatio(double orgWidth, double orgHeight, ref double newWidth, ref double newHeight)
void UploadAndResizeAnImage(HttpPostedFile file, double newWidth, double newHeight, string virPath, bool overwrite)
{
string destPath = "/";
double resWidth = 1.0;
double resHeight = 1.0;
bool owr = false;
bool exist = false;
if (virPath != "") destPath = virPath;
if (newWidth > 0) resWidth = newWidth;
if (newHeight > 0) resHeight = newHeight;
if (overwrite)
owr = true;
else
owr = false;
int pathCheck = (destPath.Substring(destPath.LastIndexOf('/') + 1)).Length;
if (pathCheck > 0) destPath += "/";
string fileName = Path.GetFileName(file.FileName);
string estensione = Path.GetExtension(file.FileName).ToLower();
ImageCodecInfo[] imgCodec = ImageCodecInfo.GetImageEncoders();
EncoderParameters encPars = new EncoderParameters(2);
EncoderParameter encPar1 = new EncoderParameter( System.Drawing.Imaging.Encoder.Quality, 100L );
EncoderParameter encPar2 = new EncoderParameter( System.Drawing.Imaging.Encoder.Compression, 100L );
encPars.Param[0] = encPar1;
encPars.Param[1] = encPar2;
destPath = Server.MapPath(destPath);
exist = File.Exists(destPath + fileName);
if (!exist && (fileName.Length != 0) || owr)
{
if (!IsImage(fileName))
{
if (fileName.Length != 0)
Status.Text += "<span style=\"color:Red;\">File '" + fileName + "' is not a valid image format. Upload... Aborted.</span>
";
return;
} // if (!IsImage(fileName))
using(System.Drawing.Image image = System.Drawing.Image.FromStream(file.InputStream))
{
CalcolaAspectRatio (image.Width, image.Height, ref resWidth, ref resHeight);
using(Bitmap bitmap = new Bitmap((int)(resWidth), (int)(resHeight)))
{
string message = "Uploaded";
bitmap.SetResolution(image.HorizontalResolution, image.VerticalResolution);
Graphics g = Graphics.FromImage(bitmap);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.DrawImage(image, new Rectangle(0, 0, (int)(resWidth), (int)(resHeight)));
g.Dispose();
if (exist && owr)
{
message = "OverWritted";
try
{
File.Delete(destPath + fileName);
}
catch(IOException ioe)
{
message = "<div id=\"error\">Error: " + ioe.GetType().Name + ": The write operation could not be performed because the specified part of the file is locked. Not OverWritted</div>";
}
} // if (exist && owr)
if ((estensione == ".jpg") || (estensione == ".jpeg"))
bitmap.Save(destPath + fileName, imgCodec[1], encPars);
else
bitmap.Save(destPath + fileName, image.RawFormat);
Status.Text += "";
} // using(Bitmap bitmap = new Bitmap( (int)(resWidth), (int)(resHeight)))
} // using(Image image = Image.FromFile(file))
} // if (!exist && (fileName.Length != 0) || owr)
else
{
if (exist && (!owr))
Status.Text += "<span style=\"color:Red;\">Error : The file \"<u>" + fileName + "</u>\" already exist... Upload Aborted.</span>
";
}
} // void UploadAndResizeAnImage(HttpPostedFile file, double newWidth, double newHeight, string virPath, bool overwrite)
protected void SubmitButton_Click(Object sender, EventArgs e)
{
HttpFileCollection uploadedFiles = Request.Files;
for (int i = 0; i < uploadedFiles.Count; i ++)
{
// Qui sotto definisci le dimensioni che vuoi, la cartella di destinazione
// e se l'applicazione deve sovrascrivere o no i files preesistenti.
//
// UploadAndResizeAnImage(HttpPostedFile file, double newWidth, double newHeight, string virPath, bool overwrite)
//
// Quindi se scrivo come qui sotto :
UploadAndResizeAnImage(uploadedFiles[i], 640.0, 480.0, "/images/resized/", true);
// significa che voglio che ogni immagine inviata (uploadedFiles[i])
// venga ridimensionata a 1024x768 (tenendo conto però delle proporzioni originali)
// e che se il file esiste non deve essere sovrascritto (overwrite = false).
// Chiaro? Più di così ;)
// Vogliamo pure i Thumbnails??? allora aggiungiamo, sempre in questo ciclo for :
UploadAndResizeAnImage(uploadedFiles[i], 185.0, 135.0, "/images/thumbs/", true);
// significa che voglio che ogni immagine inviata (uploadedFiles[i])
// venga ridimensionata a 150x150 (tenendo conto però delle proporzioni originali)
// e che se il file esiste non deve essere sovrascritto (overwrite = false).
// Cartella temporanea per scrivere poi nel db
UploadAndResizeAnImage(uploadedFiles[i], 66.0, 99.0, "/public/temp/", true);
Response.Redirect("chiudi.asp");
}
} // protected void SubmitButton_Click(Object sender, EventArgs e)
Ecco qui... qualche idea?
Grazie!