Подтвердить что ты не робот

Получить полный путь к файлу с помощью FileUpload Control

Я работаю над веб-приложением, которое использует элемент управления 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));

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

4b9b3361

Ответ 1

Try

Server.MapPath(FileUpload1.FileName);

Изменить: В этом ответе описывается, как получить путь к файлу на сервере. Он не описывает, как получить путь к файлу на клиенте, что и задал вопрос. Ответ на этот вопрос - "вы не можете", потому что современный браузер не укажет вам путь на клиенте по соображениям безопасности.

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

Ответ 5

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

Ответ 6

Convert.ToString(FileUpload1.PostedFile.FileName);

Ответ 7

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

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

Ответ 8

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

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

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

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

Path.GetFileName(fileUpload.FileName)

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

Просто для подтверждения проблемы.

Ответ 9

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

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

Ответ 10

Проверьте это:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="FileUp.aspx.vb" Inherits="FileUp" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server"></asp:Label><br />
       <asp:FileUpload ID="FileUpload1" runat="server" /><br />
        <asp:Button ID="Button1" runat="server" Text="Upload" />
    </div>
    </form>
</body>
</html>

код:

Partial Class FileUp
    Inherits System.Web.UI.Page
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim path As String
        Dim path1 As String
        path = Server.MapPath("~/")
        FileUpload1.SaveAs(path + FileUpload1.FileName)
        path1 = path + FileUpload1.FileName
        Label1.Text = path1
        Response.Write("File Uploaded successfully")
    End Sub
End Class

Ответ 11

Отметьте этот пост в разделе FileUpload Control

Кроме того, для параметра "Включение локального каталога при загрузке файлов" URLAction установлено значение "Отключить" для интернет-зоны. Это изменение предотвращает утечку потенциально чувствительной локальной файловой системы в Интернет. Например, вместо отправки полного пути C:\users\ericlaw\documents\secret\image.png, Internet Explorer 8 теперь будет отправлять только имя файла image.png.

Его вариант под безопасностью в Интернете, который можно включить

Ответ 12

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

string filename = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToString(),".xls"));
                File.WriteAllBytes(filename, FileUploadControl.FileBytes);

Ответ 13

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

Ответ 14

Я использую IE 8 (на двух отдельных машинах). Каждый из них по-прежнему загружает полный путь к локальному файлу. Как было предложено Gabriël, Path.GetFileName(fileUploadControl.PostedFile.FileName) представляется единственным способом гарантировать, что вы получите только имя файла.

Ответ 15

Path.GetFullPath(fileUpload.PostedFile.FileName);

Извините, что вы получите каталог своей программы + имя вашего файла.

Ответ 16

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

Отключено по умолчанию. Просто включите его.

Ответ 17

dim path as string = FileUpload1.PostedFile.FileName

Кстати, я использую Visual Studio 2010. Я не знаю, есть ли разница с другой версией.

Ответ 18

Это не проблема, если мы используем браузер IE. Это для других браузеров, сохраните файл в другом месте и используйте этот путь.

if (FileUpload1.HasFile)

{

string fileName = FileUpload1.PostedFile.FileName;

string TempfileLocation = @ "D:\uploadfiles \";

string FullPath = System.IO.Path.Combine(TempfileLocation, имя_файла);

FileUpload1.SaveAs(FullPath);

Response.Write(FullPath);

}

Спасибо