Javascript,从输入文件中读取并使用XMLHttpRequest上传

时间:2016-09-27 23:44:02

标签: javascript ajax encoding upload base64

抱歉我的英语。我需要上传由输入文件选择的文件(.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");

等...... 但没有改变......

我可以在没有ajax的情况下上传我的文件,但我需要保存这个文件localy ...并在操作后从变量上传它。

简而言之:

我在Base64中编码了一个字符串,如下所示:

0J/RgNC40LLQtdGCINC80LjRgCE=

嗯,我知道这个字符串是文件“SecretFile.exe”的来源。 我想解码并使用javascript上传此文件。使用标准window.atob解码后的字符串不等于原始文件源。如何解码此文件,由FileReader中的Base64编码。

谢谢。

1 个答案:

答案 0 :(得分:1)

您不必将文件读取到数据字符串,然后将其转换为Blob。任何File对象(例如您从<input type="file" />元素获得的对象)都已经是Blob,因此您可以直接将其传递给fd.append

如果您需要在上传之前操纵File对象,则应使用FileReaderreadAsArrayBuffer方法代替,这样您就可以操作ArrayBuffer直接,然后在上传之前简单地创建一个new Blob([ arrayBuffer ])的blob。