2012-10-12 53 views
5

我要上傳多個圖像使用asp.net文件上傳控制。這個解決方案有很多建議。 目前正在使用DataTable。所有圖像放入DataTable視圖狀態,然後檢查其行。我標記檢查文件名如果已經存在,那麼它將不會上傳..但 如果任何用戶瀏覽/上傳具有相同名稱但來自不同文件夾/路徑的圖像這將成爲一個問題。我的代碼在這裏如何檢查圖像已經存在/連接,而一次上傳多個圖像在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(); 

     } 

其次:使用GUID來分配圖像。但它也不適合,因爲它只會改變FileName,並且我們無法確定該文件是否存在於服務器上。 第三個選項可以是,如果文件已經存在於上傳文件夾中,我們詢問用戶他/她是否要覆蓋現有文件。 或者我應該用System.IO.File.Exists(pathToCheck)) ??

我想從你身邊很好的建議... 感謝: Saquib

回答

2

老兄! 我檢查您的代碼,並從我的角度來看... 1-不使用GUID在這個senario。使用以下代碼 2-獲取文件名稱(更改它按您的要求)

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

3-使用數組獲取圖像字節(例如字節[] imageBytes)

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

或讀取文件到一個數據流AND & &使用((System.IO.File.Exists(服務器)在FileName + FilePath上進行檢查。MapPath(SavePath + Filename))))+ ImageBytes

byte [] myData = new Byte [nFileLen];

4-之後,檢查文件是否真的是一個JPEG打開它(可以從下面的代碼一些幫助..

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)); 
     } 

希望這將有助於你...... 問候: Azeem Raavi

0

讓你在Java腳本的嘗試,可能這是幫助你在我的aspx flie在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 %>",      
        } 
       }); 

您需要傳遞SessionID作爲參數並將其保存在Global.asax文件中,否則您將在每次上傳時創建一個新的ASP.NET會話。

在jquery.uploadify.js文件,你需要找到這個功能並修改它

function onUploadStart(file) 

在這裏你可以在RETURNCODE從你的反應上傳-ASHX文件。

我使用了不同條件下不同的返回碼一樣

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

....

1

如果你不允許重複(並有到位的支票),爲什麼你會重命名文件?只需將它們保存爲其原始名稱,並在子頻繁上載執行時使用File.Exists檢查。

此外,您關心的文件夾/路徑不會是一個問題,因爲所有文件都上傳到基於您的代碼的圖像文件夾。

+1

我認爲你沒有正確理解這個問題,這意味着如果用戶從文件夾A中選擇一個圖像abc.png並上傳它,然後他從文件夾B中選擇另一個不同的圖像,並且如果該圖像具有相同的name abc.png,那麼他對圖像名稱的檢查將不允許上傳圖像,因爲具有相同名稱的圖像已經存在sts在桌子裏。這是他的問題。 –

+0

如果是這種情況,我認爲系統需要更高級,因爲無法區分這兩個文件,因爲他從上傳中獲取的所有文件都是文件名。因此,即使他使用GUID,上傳後保存的文件路徑也會相同(images/abc.jpg)。此外,使用ViewStates是保存數據的非常臨時的解決方案,只要頁面被訪問而沒有回傳,數據就消失了。之後,File.Exists將不再起作用,因爲GUID文件名全都是唯一的。 – CoderMarkus

相關問題