2012-10-12 46 views
5

Tôi sẽ tải lên nhiều hình ảnh bằng cách sử dụng điều khiển tải lên tệp asp.net. có nhiều gợi ý trong đầu cho giải pháp này .. hiện đang sử dụng DataTable. tất cả các hình ảnh được đặt trong trạng thái xem DataTable và sau đó trong khi kiểm tra các hàng của nó .. Tôi đánh dấu một Kiểm tra trên FileName nếu đã tồn tại sau đó nó sẽ không tải lên .. Nhưng nếu bất kỳ người dùng duyệt/tải lên một hình ảnh có cùng tên nhưng từ thư mục khác nhau/Đường dẫn nó sẽ trở thành một vấn đề. mã của tôi ở đâyCách kiểm tra xem hình ảnh đó đã tồn tại/đính kèm trong khi Tải lên nhiều hình ảnh tại một thời điểm trong 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(); 

     } 

Thứ hai: sử dụng GUID, để gán hình ảnh. nhưng nó cũng sẽ không phù hợp vì nó sẽ chỉ thay đổi FileName và chúng tôi không thể xác định liệu tệp này có tồn tại trên máy chủ hay không. Tùy chọn thứ ba có thể là nếu tệp đã tồn tại trong thư mục tải lên, chúng tôi yêu cầu người dùng nếu họ muốn ghi đè tệp hiện có. Hoặc tôi nên sử dụng System.IO.File.Exists(pathToCheck)) ??

Tôi muốn Gợi ý tốt từ phía bạn ... Thanks: Saquib

Trả lời

2

Dude! Tôi xem lại mã của bạn và từ quan điểm của tôi ... 1- Không sử dụng GUID trong senario này. 2- Nhận File Name sử dụng đoạn mã sau (Thay đổi nó theo yêu cầu của bạn)

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

3- Bytes Nhận Hình ảnh sử dụng mảng (ví dụ byte [] imageBytes;)

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

HOẶC đọc tập tin vào một dòng dữ liệu VÀ & & Đặt một Kiểm tra trên FileName + FilePath bằng cách sử dụng ((System.IO.File.Exists (Máy chủ.MapPath (SavePath + Tên tệp)))) + ImageBytes

byte [] myData = new Byte [nFileLen];

4 Sau đó Kiểm tra xem các tập tin thực sự là một JPEG bằng cách mở nó (có thể nhận được một số sự giúp đỡ từ mã sau ..

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

Hope Đây sẽ là hữu ích cho bạn ... Trân: Azeem Raavi

0

cho phép bạn dùng thử trong kịch bản Java, có thể đó là giúp bạn biết

trong flie aspx của tôi trong mã 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 %>",      
        } 
       }); 

bạn cần chuyển SessionID làm tham số và lấy nó trong Tệp Global.asax hoặc bạn sẽ tạo phiên ASP.NET mới trên mọi Tải lên.

Trong jquery.uploadify.js tập tin bạn cần phải tìm chức năng này và sửa đổi nó

function onUploadStart(file) 

ở đây bạn có thể phản ứng trên mã trả từ bạn tập tin Tải-ASHX.

tôi sử dụng mã trở lại khác nhau cho các điều kiện khác nhau như

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

....

1

Nếu bạn không cho phép bản sao (và có một tấm séc tại chỗ), tại sao bạn sẽ đổi tên các tập tin ? Chỉ cần lưu chúng dưới tên gốc của chúng và sử dụng File.Exists để kiểm tra khi các tải lên phụ thuộc được thực hiện.

Ngoài ra, bạn lo ngại về thư mục/đường dẫn sẽ không là vấn đề vì tất cả các tệp được tải lên thư mục hình ảnh dựa trên mã của bạn.

+1

Tôi nghĩ rằng bạn không hiểu câu hỏi đúng cách, người đó có nghĩa là nếu người dùng chọn một hình ảnh abc.png từ thư mục A và tải lên, sau đó anh ta chọn một hình ảnh KHÁC từ thư mục B và nếu hình ảnh đó giống nhau tên abc.png sau đó kiểm tra tên ảnh của anh ta sẽ không cho phép tải ảnh lên vì ảnh có cùng tên đã cũ sts trong bảng. và đó là vấn đề của anh ấy. –

+0

Nếu đúng như vậy, tôi nghĩ hệ thống cần phải nâng cao hơn vì sẽ không có cách nào để phân biệt hai tệp vì tất cả những gì anh ta lấy từ tệp tải lên là tên tệp. Vì vậy, ngay cả khi anh ấy sử dụng GUID, đường dẫn tệp đã lưu sẽ giống hệt nhau sau khi tải lên (images/abc.jpg). Ngoài ra, việc sử dụng ViewState là một giải pháp rất tạm thời để lưu dữ liệu, ngay sau khi trang được truy cập mà không cần đăng lại, dữ liệu đã biến mất. Và sau đó File.Exists sẽ không còn hoạt động như tên tệp GUID tất cả sẽ là duy nhất. – CoderMarkus

Các vấn đề liên quan