Получить полный путь к файлу с помощью FileUpload Control - PullRequest
41 голосов
/ 15 июля 2009

Я работаю над веб-приложением, которое использует элемент управления FileUpload. У меня есть файл xls в полном пути к файлу 'C: \ Mailid.xls', который я пытаюсь загрузить.

Когда я использую команду

FileUpload1.PostedFile.FileName 

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

Я также безуспешно пробовал следующие команды:

   System.IO.Path.GetFullPath(FileUpload1.PostedFile.FileName);
   Path.GetFileName(FileUpload1.PostedFile.FileName);
   System.IO.Path.GetDirectoryName(FileUpload1.PostedFile.FileName).ToString();
   Convert.ToString(System.IO.Directory.GetParent(FileUpload1.PostedFile.FileName));

Как мне получить полный путь?

Ответы [ 18 ]

29 голосов
/ 15 июля 2009

Это в настоящее время правда, что "когда вы загружаете файл, браузер будет отправлять только исходное имя файла, а не полный путь" - вполне логично, что у сервера нет дела, зная, был ли файл "C: \ WINDOWS \" или "F: \ SOMEDIR \ OTHERDIR \ PERSONALINFO \". Файл name всегда отправляется и полезен как для того, чтобы помочь пользователю «распознать» содержимое, так и, возможно, для опроса расширения файла, чтобы помочь определить тип файла.

Однако из своего опыта я знаю, что Internet Explorer определенно раньше (в более старых версиях) отправлял весь путь. Трудно найти достоверное подтверждение (кроме этого apache fileupload control doco )

Internet Explorer предоставляет полный путь к загружаемому файлу, а не только базовое имя файла

В любом случае, вы не должны использовать или ожидать, что полный путь будет отправлен любым «современным» браузером.

23 голосов
/ 15 июля 2009

Возможно, вы неправильно понимаете, как FileUpload работает.

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

Знание полного пути к файлу на клиентском компьютере обычно не требуется - вам часто нужно что-то делать с содержимым файла. Ваши примеры похожи на ASP.NET C #, поэтому я предполагаю, что вы используете элемент управления FileUpload. Вы можете получить содержимое загруженного файла, прочитав необработанный поток (FileUpload.PostedFile.InputStream) или сначала сохранив файл (FileUpload.PostedFile.SaveAs), а затем получив доступ к сохраненному файлу. Вы несете ответственность за сохранение файла, если хотите, чтобы он был доступен после текущего запроса - если вы этого не сделаете, ASP.NET удалит его.

Еще одна вещь - не забудьте установить свойство enctype в вашей форме на «multipart / form-data». Если вы этого не сделаете, браузер клиента не отправит файл, и вы потратите немало минут на размышления о том, что пошло не так.

9 голосов
/ 28 октября 2009

Начиная с IE8, полный путь больше не отправляется на сайты в зоне Интернета.

См. Раздел «Управление загрузкой файлов» в конце этого сообщения: http://blogs.msdn.com/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx для обсуждения.

8 голосов
/ 21 июня 2011
Convert.ToString(FileUpload1.PostedFile.FileName);
8 голосов
/ 15 июля 2009

FileUpload никогда не даст вам полный путь из соображений безопасности.

7 голосов
/ 19 июня 2010

Попробуйте

Server.MapPath(FileUpload1.FileName);

Редактировать: Этот ответ описывает, как получить путь к файлу на сервере. Он не описывает, как получить путь к файлу на клиенте, что и было задано вопросом. Ответ на этот вопрос «вы не можете», потому что современный браузер не будет указывать вам путь к клиенту по соображениям безопасности.

3 голосов
/ 28 октября 2009

У меня была своего рода проблема, противоположная оригинальному постеру: я получал полный путь, когда мне было нужно только имя файла. Я использовал решение Габриэля, чтобы получить только имя файла, но в процессе я обнаружил, почему вы получаете полный путь на некоторых машинах, а не на других.

Любой компьютер, подключенный к домену, вернет вам полный путь к имени файла. Я пробовал это на нескольких разных компьютерах с постоянными результатами. У меня нет объяснения, почему, но, по крайней мере, в моем тестировании это было согласованно.

3 голосов
/ 07 октября 2009

Просто, чтобы дать мои 2 цента.

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

Это конечный пользователь нашего приложения, которое размещено на стороннем сервере. Поэтому он не находится ни на локальной машине, ни на локальном сервере, с которого он может быть общим.

Вы можете решить проблему, по крайней мере, чтобы все время вести себя одинаково:

Path.GetFileName(fileUpload.FileName)

Кстати, только что нашел эту статью, в которой говорится, что это тоже может произойти: http://www.eggheadcafe.com/community/aspnet/17/10092650/fileupload-control-pro.aspx

Просто чтобы подтвердить проблему.

3 голосов
/ 15 июля 2009

IE 7 и предыдущие версии отправляли полный путь к загруженному файлу на сервер, связанный с полем input type="file". Firefox и другие современные браузеры считают это недостатком безопасности и не делают этого. Тем не менее, похоже, что это было исправлено в IE 8.

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

3 голосов
/ 26 сентября 2013

Это выдает файл в вашу временную папку с именем файла, после чего вы можете вызвать его и не беспокоиться об этом. Потому что он будет удален, если он будет находиться в вашей временной папке в течение нескольких дней.

string filename = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToString(),".xls"));
                File.WriteAllBytes(filename, FileUploadControl.FileBytes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...