FileUpload - Проверка того, что фактический файл был загружен - PullRequest
1 голос
/ 10 марта 2009

В моей веб-форме есть элемент управления FileUpload (FileUpload1), а также кнопка «Sumbit», метка и скрытое поле, содержащее идентификатор пользователя. У меня есть следующий код в событии нажатия кнопки:

string path = Server.MapPath("~/userfiles/");

if (FileUpload.HasFile)
{
    try 
    {
        FileUpload1.SaveAs(path + UserID.Value + "/image.jpg");
    }
    catch 
    {
        Label1.Text = "* unable to upload file";
        Label1.Visible = true; 
    }
}

Отлично работает, если я загружаю реальный файл. Однако если я введу несуществующее имя файла (например, «c: \ a.jpg», которого нет на моем компьютере) в текстовое поле FileUpload и нажму кнопку «Sumbit», HasFile все равно вернет true. Кроме того, SaveAs () не генерирует никаких исключений, и это пустая функция, которая не возвращает значения, указывающего на успех или неудачу. Как узнать, был ли файл действительно загружен?

Ответы [ 5 ]

8 голосов
/ 10 марта 2009

Просто проверьте, существует ли он.

if(File.Exists(myFile)){
  //it was uploaded.
}
4 голосов
/ 10 марта 2009

Вы можете проверить свойство FileUpload.PostedFile.ContentLength

2 голосов
/ 10 марта 2009

Вы можете проверить, существует ли файл с помощью File.Exists, прежде чем вызывать SaveAs.

1 голос
/ 11 марта 2009

Речь идет не о вашем реальном вопросе, но вы должны проверить любой ввод пользователя, особенно если вы хотите, чтобы пользователи загружали файлы в виртуальную папку на вашем веб-сервере. Вы должны по крайней мере проверить, соответствует ли тип содержимого файла тому, который вы ожидаете, или, что еще лучше, отфильтровать (изменить размер) изображение, используя классы, доступные в .NET Framework.

Если вы этого не сделаете, пользователи могут делиться произвольным контентом через ваш сайт или размещать вредоносные файлы (например, изображения, содержащие сценарии, которые могут выполняться некоторыми веб-браузерами) на вашем сервере.

С дополнительной проверкой вы также сможете проверить, действительно ли был отправлен контент.

И: действительно серьезная уязвимость появляется, когда вы строите путь сохранения путем объединения ввода из поля формы (я полагаю, UserID.Value - это параметр POST, который вы упомянули?). Это позволяет пользователям решать, где хранить контент на вашем сервере, и, что еще хуже, иметь возможность перезаписывать существующие файлы !!!

1 голос
/ 10 марта 2009

Хммм ....

Не уверен, что понимаю. Во-первых, в вашем коде FileUpload.HasFile не будет компилироваться. Если должно быть FileUpload1.HasFile.

Когда я исправляю это и запускаю ваш код, эта строка возвращает false, если файл не существует ...

Вы можете проверить, существует ли файл после загрузки, используя File.Exists (путь); Файловый объект является частью System.IO.

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