【问题标题】:How to get full path of selected file on change of <input type=‘file’> using javascript, jquery-ajax?如何使用 javascript、jquery-ajax 在更改 <input type='file'> 时获取所选文件的完整路径?
【发布时间】:2013-02-18 12:17:50
【问题描述】:

使用&lt;input type=‘file’&gt;选择文件时如何获取文件的完整路径

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

但 filePath 变量包含所选文件的 only name,而不是 full path
我在网上搜索过,但出于安全原因,浏览器(FF、chrome)似乎只给出了文件名。
有没有其他方法可以获取所选文件的完整路径?

【问题讨论】:

标签: javascript jquery file-upload filepath


【解决方案1】:

出于安全原因,浏览器不允许这样做,即浏览器中的 JavaScript 无法访问文件系统,但是使用 HTML5 文件 API,只有 Firefox 提供 mozFullPath 属性,但如果您尝试获取该值,它会返回一个空字符串:

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

https://jsfiddle.net/SCK5A/

所以不要浪费你的时间。

编辑:如果您需要文件的路径来读取文件,您可以改用FileReader API。这是关于 SO 的相关问题:Preview an image before it is uploaded.

【讨论】:

  • 请参阅 this link,因为它帮助我解决了同样的问题。
  • ... 链接问题的标题是:Preview an image before it is uploaded
  • 但它给了我发送到服务器的路径的 URL
  • @AmirTugi 该解决方案读取文件。它与用户文件系统上的文件路径无关。
  • 那么这个网站是怎么做到的呢?
【解决方案2】:

试试这个:

它会给你一个临时路径而不是准确的路径,如果你想像这个 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>");
});

它并不完全是您想要的,但它可能会在某个地方为您提供帮助。

【讨论】:

  • 有没有办法对其他文件类型执行此操作:pdf、docx 等,而不是图像,所以显示一个图标?对于我的用途,我想在发送文件之前将文件存储在页面上,让用户有机会添加评论以上传文件,就像带有文本的消息一样。
  • 浏览器地址栏中只需要放“tmppath”的内容吗?我试过了,还是不行。
  • @GangsarSwaPurba 不幸的是,它在 IE9 中不起作用 - see URL.createObjectURL()
  • @naXa 好,我将在上面编辑我的评论。呃,不幸的是我无法编辑我的评论
  • 在第 3 行你应该使用 tmppath 变量而不是 URL.createObjectURL(event.target.files[0]),这样更优化。
【解决方案3】:

您不能这样做 - 出于安全考虑,浏览器不允许这样做。

当使用输入 type=file 对象选择文件时,该值 value 属性的值取决于“包括本地 将文件上传到服务器时的目录路径”的安全设置 用于显示包含输入的网页的安全区域 对象。

仅返回所选文件的完全限定文件名 启用此设置时。当设置被禁用时,互联网 Explorer 8 将本地驱动器和目录路径替换为字符串 C:\fakepath\ 以防止不当信息泄露。

及其他

你在更改事件函数的末尾错过了);这个。

也不要为更改事件创建函数,而是像下面这样使用它,

<script type="text/javascript">

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

</script>

【讨论】:

  • 试过你的代码,但它给了我错误的路径。我的文件在D 目录中,但值即将到来C:\fakepath\test.xls
  • C:\fakepath\fileName.xls ...有人知道如何解决这个问题吗?
  • 这就是这个问题的重点,伙计们:它永远不会显示实际路径,并且总是会输入C:\fakepath\
【解决方案4】:

你不能。 安全性会阻止您对客户端计算机的文件系统一无所知 - 它甚至可能没有!它可以是 MAC、PC、平板电脑或支持互联网的冰箱——你不知道、不知道也不会知道。让您拥有完整路径可以为您提供有关客户端的一些信息 - 例如,如果它是网络驱动器。

实际上你可以在特定条件下获得它,但它需要一个 ActiveX 控件,并且在 99.99% 的情况下都不起作用。

无论如何,您都不能使用它将文件恢复到原始位置(因为您完全无法控制下载的存储位置,或者即使它们被存储),所以实际上它对您没有多大用处无论如何。

【讨论】:

    【解决方案5】:

    您可以使用以下代码获取上传文件的有效本地 URL:

    <script type="text/javascript">    
        var path = (window.URL || window.webkitURL).createObjectURL(file);
        console.log('path', path);
    </script>
    

    【讨论】:

      【解决方案6】:

      你是这个意思吗?

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

      【讨论】:

      • 这不会给出文件的路径。为什么投了这么多票?
      【解决方案7】:

      一个有趣的提示:虽然这在网络上不可用,但如果你在 Electron 中使用 JS,那么你可以这样做。

      使用标准 HTML5 文件输入,您将收到所选文件的额外 path 属性,其中包含真实文件路径。

      这里有完整的文档:https://github.com/electron/electron/blob/master/docs/api/file-object.md

      【讨论】:

        【解决方案8】:

        如果您可以选择上传整个文件夹,则可以

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

        更改事件将包含:

        .target.files[...].webkitRelativePath: "FOLDER/FILE.ext"
        

        但它不包含整个绝对路径,仅包含相对路径。 Firefox 也支持。

        【讨论】:

          【解决方案9】:

          你永远不应该这样做......而且我认为在最新的浏览器中尝试它是无用的(据我所知)......另一方面,所有最新的浏览器都不允许这样做......

          您可以通过一些其他链接来找到解决方法,例如获取值服务器端,但不在客户端(javascript)中

          Full path from file input using jQuery
          How to get the file path from HTML input form in Firefox 3

          【讨论】:

            【解决方案10】:

            可以使用 FileReader API 来更改 img 元素的 src。

            https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL

            【讨论】:

              【解决方案11】:

              文件元素有和数组调用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);
              

              【讨论】:

              • 它没有提供上传文件的完整路径。
              【解决方案12】:

              您只能通过IE11和MS Edge获取所选文件的完整路径。

              var fullPath = Request.Form.Files["myFile"].FileName;
              

              【讨论】:

                【解决方案13】:
                $('input[type=file]').change(function () {
                    console.log(this.files[0].path);
                });
                

                这是正确的形式

                【讨论】:

                • 这似乎在 Chrome 中不起作用? File 对象没有path 属性?
                • 哦,Chrome 正在运行...请添加行:console.log(this.files[0]) 以查看所有属性
                猜你喜欢
                • 2011-08-12
                • 2016-11-30
                • 2011-10-20
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多