2011-03-25 78 views
0

嘿傢伙,有沒有辦法覆蓋任何內容的文件夾上fileupload即使文件名不相同?我只想要一個圖像存儲在anygiven tim,但我無法知道用戶可以上傳什麼文件名,因此如何覆蓋下面的代碼?覆蓋文件上傳

if (FileUploadControl.HasFile) 
     { 
      try 
      { 
       string theUserId = Session["UserID"].ToString(); 
       OdbcConnection cn = new OdbcConnection("Driver={MySQL ODBC 3.51 Driver}; Server=localhost; Database=gymwebsite2; User=x; Password=x;"); 
       cn.Open(); 
       string filenameDB = Path.GetFileName(FileUploadControl.FileName); 
       string fileuploadpath = Server.MapPath("~/userdata/"+theUserId+"/uploadedimage/")+Path.GetFileName(FileUploadControl.FileName); 
       FileUploadControl.SaveAs(fileuploadpath); 
       string fileuploadpaths = ("~/userdata/"+theUserId+"/uploadedimage/")+filenameDB; 
       StatusLabel.Text = "Upload status: File uploaded!"; 

       OdbcCommand cmd = new OdbcCommand("INSERT INTO Pictures (UserID, picturepath) VALUES ('"+theUserId+"','"+fileuploadpaths+"')", cn); 
       cmd.ExecuteNonQuery(); 
      } 

      catch (Exception ex) 
      { 
       StatusLabel.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message; 

      } 

     } 
    } 

} 
+2

爲什麼不在複製之前刪除文件夾的內容? – 2011-03-25 12:45:15

+0

@Pekka,這是我書中的一個答案。 – Lazarus 2011-03-25 12:48:22

回答

1

當你說覆蓋它,爲什麼你不能只刪除舊文件?這可以通過在image類型的目錄列表上使用過濾器來完成,或者通過清除完整目錄(如果圖像是其中唯一文件)來完成。

由於您已經存儲了與userID關聯的文件名,所以您最好選擇將文件名從數據庫中取出。這樣,當用戶上傳新文件時,您可以調用當前用戶記錄並刪除相關文件,並在新文件上載完成後更新圖片記錄。

最後,第三種選擇是將文件作爲二進制值存儲在數據庫中。然後,每次上傳圖片時都會將圖片更新爲用戶圖片記錄。

[編輯:更多詳情]

if (FileUploadControl.HasFile) 
     { 
      try 
      { 
       string theUserId = Session["UserID"].ToString(); 
       OdbcConnection cn = new OdbcConnection("Driver={MySQL ODBC 3.51 Driver}; Server=localhost; Database=gymwebsite2; User=x; Password=x;"); 
       cn.Open(); 


// 
//Something like this 
// 


       OdbcCommand sc = new OdbcCommand(string.format("SELECT picturepath FROM Pictures WHERE UserID ='{0}'", theUserId), cn); 
       OdbcDataReader reader = command.ExecuteReader(); 
       while (reader.Read()) 
       { 
         if (System.IO.File.Exists(reader[0])) 
         { 
          System.IO.File.Delete(reader[0]); 
         } 
       } 


       string filenameDB = Path.GetFileName(FileUploadControl.FileName); 
       string fileuploadpath = Server.MapPath("~/userdata/"+theUserId+"/uploadedimage/")+Path.GetFileName(FileUploadControl.FileName); 
       FileUploadControl.SaveAs(fileuploadpath); 
       string fileuploadpaths = ("~/userdata/"+theUserId+"/uploadedimage/")+filenameDB; 
       StatusLabel.Text = "Upload status: File uploaded!"; 

       OdbcCommand cmd = new OdbcCommand("INSERT INTO Pictures (UserID, picturepath) VALUES ('"+theUserId+"','"+fileuploadpaths+"')", cn); 
       cmd.ExecuteNonQuery(); 
      } 

      catch (Exception ex) 
      { 
       StatusLabel.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message; 

      } 

     } 
    } 

} 

但是,我必須警告你。使用這樣的代碼是非常草率和不安全的。例如,在您的代碼中使用sql查詢字符串會將您的網站打開爲SQL注入攻擊。使用LINQ to SQL或實體到SQL之類的東西會更好。除了使數據讀取和寫入數據更簡單之外,它還提供防止SQL注入的數據清理。

在每次需要時從連接字符串創建OdbcConnection對象也是一個緩慢的過程。您可能希望創建一個延遲加載單例,該單例返回每個會話或應用程序實例的OdbcConnection的單個實例。

然後,如果出於某種原因,您確實想要創建OdbcConnection對象的單個實例,則可能需要查看using函數。

using (OdbcConnection cn = new OdbcConnection("Driver={MySQL ODBC 3.51 Driver}; Server=localhost; Database=gymwebsite2; User=x; Password=x;")) 
{ 

    // DO some Work here with the OdbcConnection 

} // Automatically close and dispose of the connection object to avoid memory leaks. 
+0

關於如何做的建議?如果我可以使用數據庫找到當前的圖像,並做某種刪除,然後插入做一個更新(通過權利我應該顯示該代碼)我的其他選項將在頁面加載尋找任何路徑不是存儲在我的數據庫並刪除它,但我只是不知道代碼如何做到這一點或任何你提到的選項? :S eek – 2011-03-25 13:03:05

+0

更新了包含代碼示例的響應。我在文本編輯器中輸入了它,因此沒有對它進行測試。如果你打算使用我的代碼,確保你正確地測試了一切。 – 2011-03-25 13:39:15