Don't overwrite file uploaded through FileUpload control
With the following开发者_JAVA技巧 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.
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);
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);
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.
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;
}
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.
Why don't you delete the file first if the file is exists and then invoke the "SaveAs" method?
精彩评论