2010-09-02 14 views
5

Con el siguiente código:No sobrescribir el archivo cargado a través del control 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."; 
     } 


    } 

quiero hacerlo de modo que si existe el archivo se cambia el nombre de ella, ¿hay alguna construido en la funcionalidad de este ? El ASP clásico tiene un parámetro para que cuando cargues digas house.jpg, y de nuevo se convierta en house (1) .jpg, etc. que fue útil.

Respuesta

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

no hay nada construido en - que tendrá que hacer su propio algoritmo:

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 
} 

Esto puede ser construido como un bucle así:

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

Puede comprobar si existe el archivo mediante el uso de la File clase estática:

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

no hay ningún método integrado para adi ng a (1) para el nombre del archivo, pero puede usar el método System.IO.Path.GetRandomFileName para obtener un nombre de archivo que garantice que es único. Si no necesita que el nombre del archivo sea legible, podría ser útil.

0

Te recomiendo que etiquetes el nombre de archivo con GUID para asegurarte de que cada archivo tenga nombres únicos.

Actualice la base de datos con el nombre del archivo original y reemplácela cuando se descargue el archivo.

0

¿Por qué no elimina primero el archivo si el archivo existe y luego invoca el método "Guardar como"?

2

que tienen un pequeño método que utilizo para obtener los nombres de archivos únicos como el que, mediante la adición de (1), (2), etc en ellos:

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; 
} 
Cuestiones relacionadas