Не перезаписывать файл, загруженный через элемент управления FileUpload - PullRequest
7 голосов
/ 02 сентября 2010

Со следующим кодом:

    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 был параметр, так что при загрузке произнесите, например, house.jpg, а затем снова он превратился в house (1) .jpg и т. Д., Что было полезно.

Ответы [ 6 ]

8 голосов
/ 02 сентября 2010

Ничего не встроено - вам нужно создать свой собственный алгоритм:

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);
4 голосов
/ 07 сентября 2015
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);
2 голосов
/ 02 сентября 2010

У меня есть небольшой метод, который я использую для получения уникальных имен файлов, например, добавляя к ним (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;
}
2 голосов
/ 02 сентября 2010

Вы можете проверить, существует ли файл, используя статический класс File :

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

Нет встроенного метода для добавления (1) к имени файла,но вы можете использовать метод System.IO.Path.GetRandomFileName , чтобы получить имя файла, которое гарантированно будет уникальным. Если вам не нужно, чтобы само имя файла было читабельным, это может быть полезно.

0 голосов
/ 02 сентября 2010

Почему бы вам сначала не удалить файл, если он существует, а затем вызвать метод «Сохранить как»?

0 голосов
/ 02 сентября 2010

Я рекомендую вам пометить имя файла GUID, чтобы у каждого файла были уникальные имена.

Ведение базы данных с исходным именем файла и замена его при загрузке файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...