抱歉我的英语。我需要上传由输入文件选择的文件(.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编码。
谢谢。
答案 0 :(得分:1)
您不必将文件读取到数据字符串,然后将其转换为Blob
。任何File
对象(例如您从<input type="file" />
元素获得的对象)都已经是Blob
,因此您可以直接将其传递给fd.append
。
如果您需要在上传之前操纵File
对象,则应使用FileReader
的readAsArrayBuffer
方法代替,这样您就可以操作ArrayBuffer
直接,然后在上传之前简单地创建一个new Blob([ arrayBuffer ])
的blob。