2010-09-02 62 views
5

用下面的代碼文件:不要覆蓋通過FileUpload控件上傳

protected void Button1_Click(object sender, EventArgs e) 
    { 
     if (FileUpload1.HasFile) 
     { 
      string fileExt = 
       System.IO.Path.GetExtension(FileUpload1.FileName); 

      if (fileExt == ".jpg" || fileExt == ".jpeg" || fileExt == ".gif" || fileExt == ".png") 
      { 
       try 
       { 
        FileUpload1.SaveAs(Server.MapPath("../uploads/originals/" + FileUpload1.FileName)); 
        Label1.Text = "File name: " + 
         FileUpload1.PostedFile.FileName + "<br>" + 
         FileUpload1.PostedFile.ContentLength + " kb<br>" + 
         "Content type: " + 
         FileUpload1.PostedFile.ContentType; 
       } 
       catch (Exception ex) 
       { 
        Label1.Text = "ERROR: " + ex.Message.ToString(); 
       } 
      } 
      else 
      { 
       Label1.Text = "Only image files are allowed!"; 
      } 
     } 
     else 
     { 
      Label1.Text = "You have not specified a file."; 
     } 


    } 

我希望如此,如果該文件存在,它改變了它的名字,讓它有任何內置的功能,這?經典的ASP有一個參數,所以當你上傳say.jpg時,然後它會變成house(1).jpg等等,這很有用。

回答

4
var fileName = file.FileName; 
var extension = Path.GetExtension(fileName); 
var nameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); 

var i = 1; 
while (File.Exists(uploadFolder + fileName)) 
{ 
    fileName = nameWithoutExtension.Trim() + " (" + i + ")" + extension; 
    i++; 
} 

file.SaveAs(uploadFolder + fileName); 
7

沒有什麼內置的 - 你需要讓自己的算法:

string path = Server.MapPath("../uploads/originals/" + FileUpload1.FileName); 

if(!File.Exists(path)) 
{ 
    FileUpload1.SaveAs(path); 
} 
else 
{ 
    // figure a different file name, perhaps check for existence as well 
} 

這可以被構建爲一個循環,以及:

string path = Server.MapPath("../uploads/originals/" + FileUpload1.FileName); 

while(File.Exists(path)) 
{ 
    // GetAlternatePath generates a new filename based on the path passed in 
    path = GetAlternatePath(path); 
} 
FileUpload1.SaveAs(path); 
2

您可以檢查文件是否存在通過使用File靜態等級:

bool exists = System.IO.File.Exists(fileName); 

沒有內置方法addi (1)添加到文件名中,但可以使用System.IO.Path.GetRandomFileName方法獲取保證爲唯一的文件名。如果您不需要文件名本身是可讀的,那麼這可能很有用。

0

我建議你用GUID標記文件名以確保每個文件都有唯一的名稱。

用原始文件名維護數據庫,並在下載文件時將其替換。

0

爲什麼不先刪除文件,如果該文件存在,然後調用「另存爲」方法?

2

我有使用加入(1)得到的是唯一的文件名,小法,他們(2)等:

public static string GetUniqueFilename(string folder, string postedFileName) 
{ 
    string fileExtension = postedFileName.Substring(postedFileName.LastIndexOf('.') + 1); 
    int index = 2; 

    while (File.Exists(string.Format("{0}/{1}", folder, postedFileName))) 
    { 
     if (index == 2) 
      postedFileName = 
       string.Format("{0} ({1}).{2}", 
           postedFileName.Substring(0, postedFileName.LastIndexOf('.')), 
           index, 
           fileExtension); 
     else 
      postedFileName = 
       string.Format("{0} ({1}).{2}", 
           postedFileName.Substring(0, postedFileName.LastIndexOf(' ')), 
           index, 
           fileExtension); 
     index++; 
    } 

    return postedFileName; 
}