当前位置: 首页 > 知识库问答 >
问题:

Javascript,从输入文件中读取并使用XMLHttpRequest[重复]上载

楚宪
2023-03-14

抱歉我的英语不好。我需要上载输入文件选择的文件(.exe):

<input type="file" id="myfile">

这样读(Javascript):

var myfile='';
var input = document.getElementById('myfile');
input.onchange = function(evt){
    var tgt = evt.target || window.event.srcElement, files = tgt.files;
    if (FileReader && files && files.length) {
            var fr = new FileReader();
            fr.onload = function(){
                myfile = fr.result;
            }
        fr.readAsDataURL(files[0]);
        }
}

现在我有了变量“MyFile”,比如:

"data:application/msdownload;base64,0J/RgNC40LLQtdGCINC80LjRgCE= .... etc."

在base64部分中,我有我所选择的源文件。当我尝试上传我的文件时,这个文件的编码和大小改变了,并且文件被损坏了。你做错了什么?

    var fd = new FormData();
    var b = new Blob([atob(decodeURIComponent((myfile).split(',')[1]))],{type: 'application/msdownload'});
    fd.append('file', b, "myfile.exe");
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "http://myserver/");
    xhr.send(fd);
xhr.setRequestHeader("Content-Type", "charset=windows-1251"); 
.............
xhr.setRequestHeader("Content-Type", "charset=utf-8");
0J/RgNC40LLQtdGCINC80LjRgCE=

我知道这个字符串是文件“secretfile.exe”的来源。我想解码和上传这个文件使用JavaScript。标准window.atob解码的字符串不等于原始文件源。如何真正解码这个文件,在FileReader中由Base64编码。

谢谢你。

共有1个答案

籍弘伟
2023-03-14

您不必将文件读取为数据字符串,然后将其转换为blob。任何file对象(例如从元素获取的对象)也将是blob,因此您可以直接将其传递给fd.append

如果您需要在上载之前操作fileReader对象,则应该使用fileReaderReadasArrayBuffer方法,该方法为您提供了一个可以直接操作的arrayBuffer,然后在上载之前使用新blob([arrayBuffer])创建一个blob。

 类似资料: