Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript在不使用输入的情况下读取文件_Javascript_File_Input_Onload - Fatal编程技术网

Javascript在不使用输入的情况下读取文件

Javascript在不使用输入的情况下读取文件,javascript,file,input,onload,Javascript,File,Input,Onload,我有这个代码,要将文件转换为base64,我必须单击“选择文件”,然后选择它。我想硬编码文件名,以便在页面加载时将其转换为base64 JavaScript: var handleFileSelect = function(evt) { var files = evt.target.files; var file = files[0]; if (files && file) { var reader = new FileReader(); read

我有这个代码,要将文件转换为base64,我必须单击“选择文件”,然后选择它。我想硬编码文件名,以便在页面加载时将其转换为base64

JavaScript:

var handleFileSelect = function(evt) {
  var files = evt.target.files;
  var file = files[0];

  if (files && file) {
    var reader = new FileReader();

    reader.onload = function(readerEvt) {
      var binaryString = readerEvt.target.result;
      document.getElementById("base64textarea").value = btoa(binaryString);
    };

    reader.readAsBinaryString(file);
  }

  if (window.File && window.FileReader
      && window.FileList && window.Blob) {
    document.getElementById('filePicker')
        .addEventListener('change', handleFileSelect, false);
  } else {
    alert('The File APIs are not fully supported in this browser.');
  }
};
HTML:


选择或拖动文件:

Base64编码版本

编辑:谢谢你的回答,他们真的很有帮助。

你根本无法做你想做的事。作为安全措施,不可能通过Javascript设置输入元素的路径。请检查此处:

您可以启动chrome,chrome浏览器,使用
--允许从文件访问
标志集,使用
XMLHttpRequest()
fetch()
从本地文件系统请求文件

fetch("file:///path/to/file")
.then(response => response.arrayBuffer())
.then(ab => {
  // do stuff with `ArrayBuffer` representation of file
})
.catch(err => console.log(err));

另请参见

文件API不适合在没有用户干预的情况下读取本地文件,但Web API是(当然,在其限制范围内,例如不在Chromium中工作而不显式启用对本地文件的访问等等)

因此,在这里,如果其他人需要一个如何在没有用户干预的情况下加载本地文件的工作示例,也就是说,不需要用户按下任何输入按钮(但仍然为用户提供中止加载的方法)

参数:文件名、请求类型(文本、blob等)、MIME类型和文件完全加载后要执行的函数。文件加载到变量X中,然后使用变量X填充对象

要中止文件读取,只需单击进度条(同样,只是一个示例,对程序的运行不是必需的)。因为它是异步的,所以可以同时读取所需数量的文件(为每个文件创建一个进度条)

我只为一个文本文件和一个视频创建了一些示例,但它应该适用于任何类型的文件

<html>
<head>
<meta charset="utf-8"/>
<script type="text/javascript">
function LoadFile(FileName,RespType,FileType,RunMe)
{   var AJAXFileReader=new XMLHttpRequest();

    // Creates new progress bar.
    var ProgressBar=CreateSVGProgBar("ProgressBars");

    AJAXFileReader.addEventListener("progress",
        function FRProgress(AJAXFREvt)
        {   // Calculate progress.
            var X=-1;

            if (AJAXFREvt.lengthComputable)
                X=Math.trunc(AJAXFREvt.loaded/AJAXFREvt.total*100);

            ShowProgressBar(ProgressBar,FileName,X);
        });

    AJAXFileReader.addEventListener("error",function FRFailed()
        {   // This will be executed if an error occurs.
            console.log("Error:",this.status);
        });

    AJAXFileReader.addEventListener("timeout",function FRTimeOut()
        {   // This will be executed if the reading times out.
            console.log("File reading timed out!");
        });

    AJAXFileReader.addEventListener("abort",
        function FRCancel()
        {   // This will confirm reading was aborted.
            console.log("File reading cancelled by user!");
        });

    ProgressBar.addEventListener("click",
        function KillMe()
        {   // Adds an abort command to the object.
            console.log(AJAXFileReader.readyState);
            if (AJAXFileReader.readyState!=4)
            {   console.log("Aborting file reading...");
                AJAXFileReader.abort();
            }
            ProgressBar.removeEventListener("click",KillMe);
        },
        false);

    AJAXFileReader.addEventListener("load",
        function Finished()
        {   // When reading is finished, send data to external function.
            if ((this.readyState==4)&&(this.status==200))
            {   ShowProgressBar(ProgressBar,FileName,100);
                RunMe(this.response);
                //ProgressBar.click();
            }
        },
        false);

    AJAXFileReader.open("GET",FileName,true);
    AJAXFileReader.overrideMimeType(FileType);
    AJAXFileReader.responseType=RespType;
    AJAXFileReader.timeout=10000; // Setting time-out to 10 s.

    AJAXFileReader.send();
}

function CreateSVGProgBar(AnchorId)
{   // Creates new SVG progress bar.
    var Parent=document.getElementById(AnchorId);
    var NewSVG=document.createElementNS("http://www.w3.org/2000/svg","svg");
    NewSVG.setAttribute("viewBox","0 0 102 22");
    NewSVG.setAttribute("width","102");
    NewSVG.setAttribute("height","22");
    Parent.appendChild(NewSVG);
    return NewSVG;
}

function ShowProgressBar(E,N,X)
{   // Show progress bar.
    var P=X<0?"???":X+"%";

    E.innerHTML="<text x=\"50\" y=\"16\" font-size=\"12\" fill=\"black\" stroke=\"black\" text-anchor=\"middle\">"+N+"</text><rect x=\"1\" y=\"1\" width=\""+X+"\" height=\"20\" fill=\""+(X<100?"#FF0000":"#0000FF")+"\" stroke=\"none\"/><rect x=\"1\" y=\"1\" width=\"100\" height=\"20\" fill=\"none\" stroke=\"black\" stroke-width=\"1\"/><text x=\""+X/2+"\" y=\"16\" font-size=\"12\" fill=\"black\" stroke=\"black\" text-anchor=\"middle\">"+P+"</text>";
}

function TracerOn(X)
{   // This will be executed after the file is completely loaded.
    document.getElementById("Tron").innerHTML=X;
}

function PlayIt(X)
{   // This will be executed after the file is completely loaded.
    var blob_uri=URL.createObjectURL(X);
    document.getElementById("MagicalBox").appendChild(document.createElement("source")).src=blob_uri;
}

function Startup()
{   // Run after the Page is loaded.
    LoadFile("example.txt","text","text/plain;charset=utf-8",TracerOn);
    LoadFile("video.mp4","blob","video/mp4",PlayIt);
}

</script>
</head>

<body onload="Startup()">

<div id="ProgressBars"></div>

<div id="Tron">Text...</div>

<video id="MagicalBox" width="400" controls>Video...</video>

</body>
</html>

函数加载文件(文件名、响应类型、文件类型、运行名)
{var AJAXFileReader=new XMLHttpRequest();
//创建新的进度条。
var ProgressBar=CreateSVGProgBar(“ProgressBar”);
AJAXFileReader.addEventListener(“进度”,
功能FRProgress(AJAXFREvt)
{//计算进度。
var X=-1;
if(AJAXFREvt.长度可计算)
X=数学真值(AJAXFREvt.loaded/AJAXFREvt.total*100);
ShowProgressBar(ProgressBar,文件名,X);
});
AJAXFileReader.addEventListener(“错误”,函数FRFailed()
{//如果发生错误,将执行此操作。
console.log(“错误:”,this.status);
});
AJAXFileReader.addEventListener(“超时”,函数FRTimeOut()
{//如果读取超时,将执行此操作。
log(“文件读取超时!”);
});
AJAXFileReader.addEventListener(“中止”,
函数FRCancel()
{//这将确认读取已中止。
log(“用户已取消文件读取!”);
});
ProgressBar.addEventListener(“单击”,
函数KillMe()
{//向对象添加中止命令。
log(AJAXFileReader.readyState);
if(AJAXFileReader.readyState!=4)
{console.log(“正在中止文件读取…”);
AJAXFileReader.abort();
}
ProgressBar.removeEventListener(“单击”,KillMe);
},
假);
AJAXFileReader.addEventListener(“加载”,
函数已完成()
{//读取完成后,将数据发送到外部函数。
if((this.readyState==4)和&(this.status==200))
{ShowProgressBar(ProgressBar,文件名,100);
RunMe(this.response);
//ProgressBar.click();
}
},
假);
打开(“获取”,文件名,true);
AJAXFileReader.overrideMimeType(文件类型);
AJAXFileReader.responseType=RespType;
AJAXFileReader.timeout=10000;//将超时设置为10秒。
AJAXFileReader.send();
}
函数CreateSVGProgBar(AnchorId)
{//创建新的SVG进度条。
var Parent=document.getElementById(AnchorId);
var NewSVG=document.createElements(“http://www.w3.org/2000/svg“,“svg”);
NewSVG.setAttribute(“viewBox”,“0 0 102 22”);
NewSVG.setAttribute(“宽度”、“102”);
NewSVG.setAttribute(“高度”、“22”);
Parent.appendChild(NewSVG);
返回新闻VG;
}
函数显示进度条(E、N、X)
{//显示进度条。

var P=XI感觉浏览器不允许您从用户的文件系统任意加载文件。某些事件只能通过直接用户输入生成。看起来您甚至无法从javascript设置
元素的值。请参阅。例如,我可以使用此脚本显示本地图像吗?
<html>
<head>
<meta charset="utf-8"/>
<script type="text/javascript">
function LoadFile(FileName,RespType,FileType,RunMe)
{   var AJAXFileReader=new XMLHttpRequest();

    // Creates new progress bar.
    var ProgressBar=CreateSVGProgBar("ProgressBars");

    AJAXFileReader.addEventListener("progress",
        function FRProgress(AJAXFREvt)
        {   // Calculate progress.
            var X=-1;

            if (AJAXFREvt.lengthComputable)
                X=Math.trunc(AJAXFREvt.loaded/AJAXFREvt.total*100);

            ShowProgressBar(ProgressBar,FileName,X);
        });

    AJAXFileReader.addEventListener("error",function FRFailed()
        {   // This will be executed if an error occurs.
            console.log("Error:",this.status);
        });

    AJAXFileReader.addEventListener("timeout",function FRTimeOut()
        {   // This will be executed if the reading times out.
            console.log("File reading timed out!");
        });

    AJAXFileReader.addEventListener("abort",
        function FRCancel()
        {   // This will confirm reading was aborted.
            console.log("File reading cancelled by user!");
        });

    ProgressBar.addEventListener("click",
        function KillMe()
        {   // Adds an abort command to the object.
            console.log(AJAXFileReader.readyState);
            if (AJAXFileReader.readyState!=4)
            {   console.log("Aborting file reading...");
                AJAXFileReader.abort();
            }
            ProgressBar.removeEventListener("click",KillMe);
        },
        false);

    AJAXFileReader.addEventListener("load",
        function Finished()
        {   // When reading is finished, send data to external function.
            if ((this.readyState==4)&&(this.status==200))
            {   ShowProgressBar(ProgressBar,FileName,100);
                RunMe(this.response);
                //ProgressBar.click();
            }
        },
        false);

    AJAXFileReader.open("GET",FileName,true);
    AJAXFileReader.overrideMimeType(FileType);
    AJAXFileReader.responseType=RespType;
    AJAXFileReader.timeout=10000; // Setting time-out to 10 s.

    AJAXFileReader.send();
}

function CreateSVGProgBar(AnchorId)
{   // Creates new SVG progress bar.
    var Parent=document.getElementById(AnchorId);
    var NewSVG=document.createElementNS("http://www.w3.org/2000/svg","svg");
    NewSVG.setAttribute("viewBox","0 0 102 22");
    NewSVG.setAttribute("width","102");
    NewSVG.setAttribute("height","22");
    Parent.appendChild(NewSVG);
    return NewSVG;
}

function ShowProgressBar(E,N,X)
{   // Show progress bar.
    var P=X<0?"???":X+"%";

    E.innerHTML="<text x=\"50\" y=\"16\" font-size=\"12\" fill=\"black\" stroke=\"black\" text-anchor=\"middle\">"+N+"</text><rect x=\"1\" y=\"1\" width=\""+X+"\" height=\"20\" fill=\""+(X<100?"#FF0000":"#0000FF")+"\" stroke=\"none\"/><rect x=\"1\" y=\"1\" width=\"100\" height=\"20\" fill=\"none\" stroke=\"black\" stroke-width=\"1\"/><text x=\""+X/2+"\" y=\"16\" font-size=\"12\" fill=\"black\" stroke=\"black\" text-anchor=\"middle\">"+P+"</text>";
}

function TracerOn(X)
{   // This will be executed after the file is completely loaded.
    document.getElementById("Tron").innerHTML=X;
}

function PlayIt(X)
{   // This will be executed after the file is completely loaded.
    var blob_uri=URL.createObjectURL(X);
    document.getElementById("MagicalBox").appendChild(document.createElement("source")).src=blob_uri;
}

function Startup()
{   // Run after the Page is loaded.
    LoadFile("example.txt","text","text/plain;charset=utf-8",TracerOn);
    LoadFile("video.mp4","blob","video/mp4",PlayIt);
}

</script>
</head>

<body onload="Startup()">

<div id="ProgressBars"></div>

<div id="Tron">Text...</div>

<video id="MagicalBox" width="400" controls>Video...</video>

</body>
</html>