2012-10-12 71 views
5

Voy a cargar varias imágenes con el control de carga de archivos asp.net. hay muchas sugerencias en mente para esta solución. actualmente estoy usando DataTable. todas las imágenes se ponen en estado de vista de DataTable y luego mientras se verifican sus filas ... Marcaré un Check en FileName si ya existe, entonces no se cargará ... Pero si algún usuario examina/carga una imagen con el mismo nombre pero desde diferentes carpetas/rutas se convertirá en un problema. mi código está aquíCómo comprobar que la imagen ya existe/está conectada al cargar varias imágenes a la vez en C#, asp.net

private void AttachImage() 
     { 
       string fileName = Convert.ToString(Guid.NewGuid()); 
       string filePath = "images/" + fileName; 
       fileName = Path.GetFileName(ImageUpload.PostedFile.FileName); 
       ImageUpload.SaveAs(Server.MapPath(filePath)); 
       DataTable dt = new DataTable(); 

       DataColumn dc = new DataColumn(); 
       dc = new DataColumn("Name", typeof(String)); 
       dt.Columns.Add(dc); 

       dc = new DataColumn("Path", typeof(String)); 
       dt.Columns.Add(dc); 

       dt.Rows.Add(fileName, filePath); 
       if (ViewState["dt"] == null) 
       { 
        ViewState["dt"] = dt; 
       } 
       else// (ViewState["dt"] != null) 
       { 
        DataTable tmpTable = (DataTable)ViewState["dt"]; 
        tmpTable.Rows.Add(fileName, filePath); 
        ViewState["dt"] = tmpTable; 
       } 


      lstProductsImage.DataSource = (DataTable)ViewState["dt"]; 
      lstProductsImage.DataBind(); 

     } 

En segundo lugar: uso de GUID, para asignar imágenes. pero tampoco será adecuado ya que solo cambiará FileName y no podremos determinar si este archivo existe en el servidor o no. Tercera opción puede ser que si el archivo ya existe en la carpeta de carga, le preguntamos al usuario si desea sobrescribir el archivo existente. O debería usar System.IO.File.Exists(pathToCheck)) ??

Quiero buenas sugerencias de su lado ... Gracias : Saquib

Respuesta

2

¡Amigo! Reviso su código y desde mi punto de vista ... 1- No use GUID en este senario. 2- Obtener el nombre del archivo usando el código siguiente (cambiarlo como por su exigencia)

string fileName = System.IO.Path.GetFileName(dsPhotosFiles.Tables[0].Rows[i]["filePath"].ToString()); 

3- Bytes obtener una imagen utilizando matriz (por ejemplo imageBytes byte [];)

byte[] imageBytes; 
    imageBytes = (byte[])dsPhotosFiles.Tables[0].Rows[i]["fileBytes"]; 

o leer el archivo en una secuencia de datos AND & & Ponga una marca en FileName + FilePath usando ((System.IO.File.Exists (Server.MapPath (SavePath + Filename)))) + ImageBytes

byte [] myData = new Byte [nFileLen];

4- Después de que comprobar si el archivo es realmente un JPEG abriéndolo (puede conseguir algo de ayuda de código siguiente ..

System.Drawing.Image.GetThumbnailImageAbort myCallBack = 
         new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback); 
     Bitmap myBitmap; 

     try 
     { 
      myBitmap = new Bitmap(Server.MapPath(sSavePath + sFilename)); 

      // If jpg file is a jpeg, create a thumbnail filename that is unique. 
      file_append = 0; 
      string sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) 
                + sThumbExtension + ".jpg"; 
      while (System.IO.File.Exists(Server.MapPath(sSavePath + sThumbFile))) 
      { 
       file_append++; 
       sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) + 
           file_append.ToString() + sThumbExtension + ".jpg"; 
      } 

      // Save thumbnail and output it onto the webpage 
      System.Drawing.Image myThumbnail 
        = myBitmap.GetThumbnailImage(intThumbWidth, 
               intThumbHeight, myCallBack, IntPtr.Zero); 
      myThumbnail.Save (Server.MapPath(sSavePath + sThumbFile)); 
      imgPicture.ImageUrl = sSavePath + sThumbFile; 

      // Displaying success information 
      lblOutput.Text = "File uploaded successfully!"; 

      // Destroy objects 
      myThumbnail.Dispose(); 
      myBitmap.Dispose(); 
     } 
     catch (ArgumentException errArgument) 
     { 
      // The file wasn't a valid jpg file 
      lblOutput.Text = "The file wasn't a valid jpg file."; 
      System.IO.File.Delete(Server.MapPath(sSavePath + sFilename)); 
     } 

Esperamos que esto sea útil para usted ... Saludos: Azeem Raavi

0

permitirá probar en Java script, puede ser eso ayudará a saber

en mi flie aspx en código Java

$("#UPLOAD_BUTTON").uploadify({ 
        'buttonClass' : "ui-icon ui-icon-plus", 
        'swf'   : '/web/uploader/uploadify.swf',     
        'uploader'  : '/web/uploader/Uploadify.ashx?ASPSESSID=<% =Session.SessionID %>', 
        'cancelImage' : '/web/uploader/uploadify-cancel.png', 
        'folder'   : '/uploads', 
        'multi'   : true, 
        'auto'   : true, 
        'checkExisting' : '/web/uploader/Uploadify.ashx?check=true', 
        'queueID'  : "UploadFilesQueue", 
        'buttonText'  : ' ',   
        'hideButton'  : true, 
        'fileTypeExts' : '*.*', 
        'fileTypeDesc' : 'Alle Dateien', 
        'onQueueComplete': function(event,data) {      
        }, 
        postData : { 
        "stepID" : $("#lblStepID").text(), 
        "ASPSESSID" : "<% =Session.SessionID %>",      
        } 
       }); 

necesita pasar el SessionID como parámetro y tomarlo en el archivo Global.asax o creará una nueva sesión de ASP.NET en cada carga.

En los jquery.uploadify.js archivo que necesita para encontrar esta función y modificarlo

function onUploadStart(file) 

aquí se puede reaccionar en el RETURNCODE de usted archivo Sube-ASHX.

que utilizan diferentes códigos de retorno para diferentes condiciones como

ReturnCode=1 -> File allready Exists 
ReturnCode=2 -> File is to Big 

....

1

Si no está permitiendo que los duplicados (y no es un cheque en su lugar), ¿por qué cambiar el nombre de los archivos ? Simplemente guárdelos con su nombre original y use la opción File.Exists cuando se realicen cargas subsaces.

Además, su preocupación acerca de la carpeta/ruta de acceso no sería un problema porque todos los archivos se cargan en la carpeta de imágenes en función de su código.

+1

Creo que no entendiste la pregunta correctamente. Ese tipo significaba que si el usuario selecciona una imagen abc.png de la carpeta A y la carga, entonces selecciona otra imagen DIFERENTE de la carpeta B y si esa imagen tiene el mismo nombrar abc.png luego su control en el nombre de la imagen no permitirá cargar la imagen porque la imagen con el mismo nombre ya exi pts en la mesa. y ese es su problema –

+0

Si ese es el caso, creo que el sistema necesita estar más avanzado porque no habría forma de diferenciar los dos archivos, ya que todo lo que está tomando de la carga es el nombre del archivo. Por lo tanto, incluso si utilizara GUID, la ruta del archivo guardada sería idéntica después de la carga (images/abc.jpg). Además, el uso de ViewStates es una solución muy temporal para guardar los datos, tan pronto como se visita la página sin devolución de datos, los datos desaparecen. Y después de eso, File.Exists ya no funcionaría ya que los nombres de los archivos GUID serían únicos. – CoderMarkus

Cuestiones relacionadas