Как получить полный путь к выбранному файлу при изменении <input type = 'file'>, используя javascript, jquery-ajax?

240

Как получить полный путь к файлу при выборе файла с помощью <input type=‘file’>

<input type="file" id="fileUpload">
<script type="text/javascript">
function getFilePath(){
     $('input[type=file]').change(function () {
         var filePath=$('#fileUpload').val(); 
     });
}
</script>

но filePath var содержит only nameвыбранный файл, а не full path.
Я искал его в сети, но кажется, что по соображениям безопасности браузеры (FF, Chrome) просто дают имя файла.
Есть ли другой способ получить полный путь к выбранному файлу?

Йогеш Пингл
источник
@nauphal спасибо за комментарий, но есть ли другой способ получить полный путь к выбранному файлу?
Йогеш Пингл
1
Если вы хотите получить путь к файлу на сервере (например, создав веб-интерфейс для утилиты командной строки, запускаемой на сервере), вы всегда можете построить относительный путь, отправив его через в качестве <option> и используйте виджет дерева или введите его вперед, чтобы позволить пользователю выбрать его и затем сервер обработать файл.
dardenfall

Ответы:

164

По соображениям безопасности браузеры не допускают этого, т. Е. JavaScript в браузере не имеет доступа к файловой системе, однако, используя файловый API HTML5, только Firefox предоставляет mozFullPathсвойство, но если вы пытаетесь получить значение, он возвращает пустую строку:

$('input[type=file]').change(function () {
    console.log(this.files[0].mozFullPath);
});

http://jsfiddle.net/SCK5A/

Так что не трать свое время.

редактировать: если вам нужен путь к файлу для чтения файла, вы можете использовать вместо него FileReader API. Вот связанный вопрос по SO: Предварительный просмотр изображения перед его загрузкой.

не определено
источник
1
Посмотрите эту ссылку, поскольку она помогла мне с той же проблемой.
Амир Tugi
... Название связанного вопроса: Предварительный просмотр изображения перед его загрузкой .
не определено
И все же он получил мне URL для пути для отправки на сервер
Амир Туги
1
@AmirTugi Это решение читает файл. Это не имеет никакого отношения к пути файла в файловой системе пользователя.
не определено
Так как же этот сайт мог это сделать?
СаидбакР
102

Попробуй это:

Это даст вам временный путь, а не точный путь, вы можете использовать этот скрипт, если вы хотите показать выбранные изображения, как в этом примере jsfiddle (попробуйте это, выбрав изображения, а также другие файлы): -

JSFIDDLE

Вот код: -

HTML: -

<input type="file" id="i_file" value=""> 
<input type="button" id="i_submit" value="Submit">
<br>
<img src="" width="200" style="display:none;" />
<br>
<div id="disp_tmp_path"></div>

JS: -

$('#i_file').change( function(event) {
    var tmppath = URL.createObjectURL(event.target.files[0]);
    $("img").fadeIn("fast").attr('src',URL.createObjectURL(event.target.files[0]));

    $("#disp_tmp_path").html("Temporary Path(Copy it and try pasting it in browser address bar) --> <strong>["+tmppath+"]</strong>");
});

Это не совсем то, что вы искали, но может быть, это может вам где-нибудь помочь.

DWX
источник
Есть ли способ сделать это с другими типами файлов: PDF, DOCX и т. Д., И вместо изображения, чтобы показать значок? Для своих целей я хочу сохранить файлы на странице, прежде чем отправлять их, давая пользователю возможность добавить комментарий, чтобы загрузить его, как сообщение с текстом.
user1040975
Нужно только поместить содержимое «tmppath» в адресную строку браузера? Я пытался, и это не работает.
МакГрубер
@GangsarSwaPurba К сожалению, это не работает в IE9 - см. URL.createObjectURL () .
NaXa
@naXa хорошо, я отредактирую свой комментарий выше. ну, к сожалению, я не могу отредактировать свой комментарий
Гангсар Свапурба
2
В 3-й строке вы должны использовать переменную tmppath вместо URL.createObjectURL (event.target.files [0]), это более оптимизировано.
Вессам Эль Махди
17

Вы не можете сделать это - браузер не допустит этого из-за проблем безопасности.

Когда файл выбирается с использованием объекта input type = file, значение свойства value зависит от значения параметра безопасности «Включить путь к локальному каталогу при загрузке файлов на сервер» для зоны безопасности, используемой для отображения веб-страницы. содержащий входной объект.

Полное имя файла выбранного файла возвращается, только если этот параметр включен. Когда параметр отключен, Internet Explorer 8 заменяет локальный диск и путь к каталогу строкой C: \ fakepath \, чтобы предотвратить несоответствующее раскрытие информации.

И другие

Вы пропустили );это в конце функции изменения события.

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

<script type="text/javascript">

    $(function()
    {
        $('#fileUpload').on('change',function ()
        {
            var filePath = $(this).val();
            console.log(filePath);
        });
    });

</script>
Дипеш Пармар
источник
19
Попробовал ваш код, но он дал мне неверный путь. мой файл находится в Dкаталоге, но значение приходитC:\fakepath\test.xls
Rahul Munjal
3
C: \ fakepath \ fileName.xls ... кто-нибудь знает, как решить эту проблему?
Андре Дос Сантос
14

Ты не можешь Безопасность останавливает вас за то, что вы ничего не знаете о файловой системе клиентского компьютера - она ​​может даже не иметь ее! Это может быть MAC, ПК, планшет или интернет-холодильник - вы не знаете, не можете знать и не будете знать. Если вы укажете полный путь, это может дать вам некоторую информацию о клиенте, особенно если это, например, сетевой диск.

Фактически вы можете получить его при определенных условиях, но для него требуется элемент управления ActiveX, и он не будет работать в 99,99% случаев.

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

Райшекар Редди
источник
11

Вы имели в виду это?

$('#i_file').change( function(event) {
var tmppath = URL.createObjectURL(event.target.files[0]);
    $("img").fadeIn("fast").attr('src',tmppath);       
});
Aytac Gul
источник
4
это не дает путь к файлу. Почему проголосовали так много раз?
FlowUI. SimpleUITesting.com
7

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

<script type="text/javascript">    
    var path = (window.URL || window.webkitURL).createObjectURL(file);
    console.log('path', path);
</script>
Штеффен Брем
источник
5

Одно интересное примечание: хотя это не доступно в Интернете, если вы используете JS в Electron, то вы можете сделать это.

Используя стандартный ввод файла HTML5, вы получите дополнительное pathсвойство для выбранных файлов, содержащее реальный путь к файлу.

Полные документы здесь: https://github.com/electron/electron/blob/master/docs/api/file-object.md

Тим Перри
источник
1

Вы можете, если вы загружаете всю папку

<input type="file" webkitdirectory directory multiple/>

Событие изменения будет содержать:

.target.files[...].webkitRelativePath: "FOLDER/FILE.ext"
phil294
источник
1

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

некоторые другие ссылки, по которым вы можете перейти, чтобы найти обходной путь, такой как получение значения на стороне сервера, но не на стороне клиента (javascript)

Полный путь от ввода файла с помощью jQuery
Как получить путь к файлу из формы ввода HTML в Firefox 3

bipen
источник
-1

элемент file имеет и вызов массива filesсодержит все необходимые вещи

var file = document.getElementById("upload");

file.addEventListener("change", function() {
    for (var i = 0; i < file.files.length; i++) {
        console.log(file.files[i].name);
    }
}, false);
Джива Кумар
источник
2
Он не предоставляет полный путь к загруженному файлу.
Серджиу Маре
-3

Вы можете получить полный путь к выбранному файлу для загрузки только IE11 и MS Edge.

var fullPath = Request.Form.Files["myFile"].FileName;
Libertad
источник