views:

81

answers:

5

With the following code:

    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.";
        }


    }

I want to make it so that if the file exists it changes the name of it, is there any built in functionality for this? Classic ASP had a parameter so that when you upload say house.jpg, and then again it would become house(1).jpg etc etc which was useful.

+1  A: 

There is nothing built in - you will need to make your own algorithm:

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
}

This can be constructed as a loop 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);
Oded
+1  A: 

You can check if the file exists by using the File static class:

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

There is no built-in method for adding a (1) to the file name, but you can use the System.IO.Path.GetRandomFileName method to get a file name that is guaranteed to be unique.If you don't need the file name itself to be readable then this might be useful.

Rune Grimstad
A: 

I recommend you to tag the Filename with GUID to ensure that each file has unique names.

Maintain the database with the original file name and replace it when the file is downloaded.

abhishek
A: 

Why don't you delete the file first if the file is exists and then invoke the "SaveAs" method?

Tim Li
+1  A: 

I have a small method that I use to get unique filenames like that, by adding (1), (2) etc on them:

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;
}
Dan Dumitru