This question already has answers here:
Creating a Blob from a base64 string in JavaScript
                                
                                    (12个答案)
                                
                        
                                3年前关闭。
            
                    
对不起我的英语。我需要上传由输入文件选择的文件(.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上传文件,但是我需要本地保存此文件...并在操作后从变量上传文件。

简而言之:

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

0J/RgNC40LLQtdGCINC80LjRgCE=


好吧,我知道此字符串是文件“ SecretFile.exe”的来源。
我想使用javascript解码并上传此文件。使用standart window.atob时,解码后的字符串不等于原始文件源。由FileReader中的Base64编码的此文件的真实解码方式。

谢谢。

最佳答案

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

如果需要在上载前处理File对象,则应改用FileReaderreadAsArrayBuffer方法,该方法为您提供一个可以直接操作的ArrayBuffer,然后只需使用上传之前。

关于javascript - Javascript,从输入文件中读取并使用XMLHttpRequest上传,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39735945/

10-11 22:29
查看更多