2010-09-02 20 views
5

z następującego kodu:Nie nadpisuje plik przesłany przez kontrolę 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."; 
     } 


    } 

Chcę zrobić to tak, że jeśli plik istnieje zmienia nazwę tego, czy jest jakiś wbudowany w funkcjonalności tego ? Klasyczny ASP miał parametr, który po przesłaniu powiedział house.jpg, a następnie ponownie stał się house (1) .jpg etcetera itp., Co było użyteczne.

Odpowiedz

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

Nie ma nic zbudowany w - trzeba będzie zrobić własną algorytmu:

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 
} 

ten może być zbudowany jako pętla, a także:

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

można sprawdzić, czy plik istnieje przy użyciu klasy statycznej File:

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

Nie ma wbudowanej metody dodawania ng a (1) do nazwy pliku, ale możesz użyć metody System.IO.Path.GetRandomFileName, aby uzyskać nazwę pliku, która jest gwarantowana jako unikalna. Jeśli nie potrzebujesz, aby nazwa pliku była czytelna, może być przydatna.

0

Zalecam oznaczenie nazwy pliku identyfikatorem GUID, aby upewnić się, że każdy plik ma unikalne nazwy.

Zachowaj bazę danych z oryginalną nazwą pliku i zastąp ją po pobraniu pliku.

0

Dlaczego najpierw nie usunąć pliku, jeśli plik istnieje, a następnie wywołać metodę "SaveAs"?

2

Mam mały metody, które mogę używać, aby uzyskać unikalne nazwy plików tak, dodając (1), (2) itp na nich

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; 
} 
Powiązane problemy