HttpPostedFile.FileName - отличается от IE
Когда я загружаю файл на сайт с помощью ASP: File, свойство FileName отличается в IE и Firefox. В Firefox он просто предоставляет имя файла, но IE предоставляет полный путь к файлу.
Я работал над этим, добавив код:
Dim FileName As String = file.FileName
If FileName.LastIndexOf("\") > 0 Then
FileName = FileName.Substring(FileName.LastIndexOf("\") + 1)
End If
Но я не уверен, почему это будет отличаться от разных браузеров. Кто-нибудь знает причину этого?
Спасибо.
Ответы
Ответ 1
Это проблема безопасности/конфиденциальности, firefox/mozilla делает все правильно, и вы не сможете получить полный путь без надстройки, апплета, silverlight, flash или какого-либо другого механизма.
Вот более подробная информация о позиции Mozilla:
https://developer.mozilla.org/en/Updating_web_applications_for_Firefox_3
См. раздел Изменения безопасности- > Поля загрузки файлов
Я надеюсь, что IE последует этому примеру, поэтому у нас есть стабильная и безопасная среда.
Ответ 2
Простой обходной путь для этого протестированного в IE и Chrome
new FileInfo(myHttpPostedFileBase.FileName).Name
Это гарантирует, что вы всегда получите только имя файла, даже если этот путь включен.
Ответ 3
В IE8 это поведение изменилось, и оно будет ТОЛЬКО передавать имя файла, а не полный путь.; -)
Подробности и ссылка на сообщение IE в блоге, где обсуждаются изменения в IE8:
http://blogs.msdn.com/b/webtopics/archive/2009/07/27/uploading-a-file-using-fileupload-control-fails-in-ie8.aspx
Службы Serverside, предназначенные для анализа имени файла, должны проверять, но не ожидать, чтобы иметь обратную косую черту в имени файла.
Изменение настроек пользователя IE8:
http://blogs.msdn.com/blogfiles/webtopics/WindowsLiveWriter/UploadingafileusingFileUploadcontrolfail_167/clip_image002_2.jpg
Ответ 4
Вы также можете использовать Path.GetFileName(File.FileName), которые возвращают только имя файла.
Пример:
Dim File As HttpPostedFile = context.Request.Files("txtFile")
' let FileName is "d:\temp\1.txt"
Dim FileName As String = Path.GetFileName(File.FileName)
' FileName will be "1.txt"