<input type="file" id="file-id" name="file_name" onchange="theimage();">
这是我的上传按钮。
<input type="text" name="file_path" id="file-path">
这是我必须显示文件完整路径的文本字段。
function theimage(){
var filename = document.getElementById('file-id').value;
document.getElementById('file-path').value = filename;
alert(filename);
}
这是解决我问题的JavaScript。但是警报值给了我
C:\fakepath\test.csv
和Mozilla给了我:
test.csv
但我想要本地完全限定的文件路径。如何解决这个问题?
如果这是由于浏览器安全问题,那么应该采用哪种替代方法呢?
答案 0 :(得分:155)
某些浏览器具有一项安全功能,可防止JavaScript知道您文件的本地完整路径。这是有道理的 - 作为客户端,您不希望服务器知道本地计算机的文件系统。如果所有浏览器都这样做会很好。
答案 1 :(得分:56)
使用
document.getElementById("file-id").files[0].name;
而不是
document.getElementById('file-id').value
答案 2 :(得分:37)
如果您转到Internet Explorer,工具,Internet选项,安全性,自定义,请找到“将文件上载到服务器时包括本地目录路径”(这是相当不错的方法)并单击“启用”。这将有效
答案 3 :(得分:34)
我在输入onchange
事件中使用对象FileReader作为输入文件类型!此示例使用readAsDataURL函数,因此您应该有一个标记。 FileReader对象还有readAsBinaryString来获取二进制数据,以后可以用它来在服务器上创建相同的文件
示例:
var input = document.getElementById("inputFile");
var fReader = new FileReader();
fReader.readAsDataURL(input.files[0]);
fReader.onloadend = function(event){
var img = document.getElementById("yourImgTag");
img.src = event.target.result;
}
答案 4 :(得分:11)
我很高兴浏览器能够将我们从侵入式脚本等中拯救出来。我不满意IE在浏览器中放入一些简单的样式修复看起来像黑客攻击!
我用了一个&lt; span&gt;表示文件输入,以便我可以将适当的样式应用于&lt; div>而不是&lt;输入&gt; (再一次,因为IE)。现在由于这个IE想要向用户显示一个价值的路径,这个价值只是保证让他们保持警惕并且至少让人担心(如果不是完全吓唬他们的话!)...更多IE-CRAP!
无论如何,感谢那些在这里发布解释的人:IE Browser Security: Appending "fakepath" to file path in input[type="file"],我已经整理了一个小修正器 - 鞋帮...
下面的代码做了两件事 - 它修复了一个IE IE的错误,其中onChange事件在上传字段的onBlur之前不会触发,它会更新一个带有清理文件路径的元素,不会吓到用户。
// self-calling lambda to for jQuery shorthand "$" namespace
(function($){
// document onReady wrapper
$().ready(function(){
// check for the nefarious IE
if($.browser.msie) {
// capture the file input fields
var fileInput = $('input[type="file"]');
// add presentational <span> tags "underneath" all file input fields for styling
fileInput.after(
$(document.createElement('span')).addClass('file-underlay')
);
// bind onClick to get the file-path and update the style <div>
fileInput.click(function(){
// need to capture $(this) because setTimeout() is on the
// Window keyword 'this' changes context in it
var fileContext = $(this);
// capture the timer as well as set setTimeout()
// we use setTimeout() because IE pauses timers when a file dialog opens
// in this manner we give ourselves a "pseudo-onChange" handler
var ieBugTimeout = setTimeout(function(){
// set vars
var filePath = fileContext.val(),
fileUnderlay = fileContext.siblings('.file-underlay');
// check for IE's lovely security speil
if(filePath.match(/fakepath/)) {
// update the file-path text using case-insensitive regex
filePath = filePath.replace(/C:\\fakepath\\/i, '');
}
// update the text in the file-underlay <span>
fileUnderlay.text(filePath);
// clear the timer var
clearTimeout(ieBugTimeout);
}, 10);
});
}
});
})(jQuery);
答案 5 :(得分:6)
我遇到了同样的问题。在IE8中,它可以通过在文件输入控件之后创建隐藏输入来解决。填充它的前一个兄弟的价值。在IE9中,这已得到修复。
我想要了解完整路径的原因是在上传之前创建一个javascript图像预览。现在我必须上传文件以创建所选图像的预览。
答案 6 :(得分:3)
如果你真的需要发送uploded文件的完整路径,那么你可能不得不使用类似签名的java applet,因为如果浏览器没有发送它,就没有办法获取这些信息
答案 7 :(得分:2)
为什么不只使用target.files?
(我在此示例中使用的是React JS)
const onChange = (event) => {
const value = event.target.value;
// this will return C:\fakepath\somefile.ext
console.log(value);
const files = event.target.files;
//this will return an ARRAY of File object
console.log(files);
}
return (
<input type="file" onChange={onChange} />
)
我在上面所说的File object
看起来像这样:
{
fullName: "C:\Users\myname\Downloads\somefile.ext"
lastModified: 1593086858659
lastModifiedDate: (the date)
name: "somefile.ext"
size: 10235546
type: ""
webkitRelativePath: ""
}
因此,如果您想获取路径,则只需获取fullName
。
答案 8 :(得分:1)
似乎您无法通过js在localhost中找到完整路径,但您可以隐藏伪路径以仅显示文件名。 Use jQuery to get the file input's selected filename without the path
答案 9 :(得分:0)
这是我的javascript函数, 希望它可以帮到你:
function FixPath(Path)
{
var HiddenPath = Path.toString();
alert(HiddenPath.indexOf("FakePath"));
if (HiddenPath.indexOf("FakePath") > 1)
{
var UnwantedLength = HiddenPath.indexOf("FakePath") + 7;
MainStringLength = HiddenPath.length - UnwantedLength;
var thisArray =[];
var i = 0;
var FinalString= "";
while (i < MainStringLength)
{
thisArray[i] = HiddenPath[UnwantedLength + i + 1];
i++;
}
var j = 0;
while (j < MainStringLength-1)
{
if (thisArray[j] != ",")
{
FinalString += thisArray[j];
}
j++;
}
FinalString = "~" + FinalString;
alert(FinalString);
return FinalString;
}
else
{
return HiddenPath;
}
}
此处仅用于测试:
$(document).ready(function () {
FixPath("hakounaMatata:/7ekmaTa3mahaLaziz/FakePath/EnsaLmadiLiYghiz");
});
// this will give you : ~/EnsaLmadiLiYghiz
答案 10 :(得分:0)
使用文件阅读器:
$(document).ready(function() {
$("#input-file").change(function() {
var length = this.files.length;
if (!length) {
return false;
}
useImage(this);
});
});
// Creating the function
function useImage(img) {
var file = img.files[0];
var imagefile = file.type;
var match = ["image/jpeg", "image/png", "image/jpg"];
if (!((imagefile == match[0]) || (imagefile == match[1]) || (imagefile == match[2]))) {
alert("Invalid File Extension");
} else {
var reader = new FileReader();
reader.onload = imageIsLoaded;
reader.readAsDataURL(img.files[0]);
}
function imageIsLoaded(e) {
$('div.withBckImage').css({ 'background-image': "url(" + e.target.result + ")" });
}
}
答案 11 :(得分:0)
补充Sardesh Sharma的答案:
document.getElementById("file-id").files[0].path
有关完整路径。
答案 12 :(得分:0)
您将至少能够获得计算机上文件路径的临时创建副本。这里唯一的条件是您的输入元素应在表格内
您要做的就是将属性enctype
放在表格中,例如:
<form id="formid" enctype="multipart/form-data" method="post" action="{{url('/add_a_note' )}}">...</form>
答案 13 :(得分:-1)
我使用 axios 解决了我的问题。
pool.end()