2016-07-06 175 views
3

我想上传一个二进制文件(PDF是具体的)无效文件,这个JS-段:文件上传:在服务器上

function uploadFile() { 
    var reader = new FileReader(); 
    var file = document.getElementById('uploadInput').files[0]; 
    console.log(file.size); 
    var xhr = new XMLHttpRequest(); 

    xhr.open('POST', 'custom?id=upload'); 
    xhr.setRequestHeader("Content-Type", "application/pdf"); 
    xhr.overrideMimeType('application/pdf'); 
    reader.onload = function(evt) { 
     xhr.send(evt.target.result); 
    }; 
    reader.readAsBinaryString(file); 
} 

在服务器端(Java)的我接收请求并将文件写入磁盘。
但是,当我打开PDF时,我得到了〜4MB的空间,而我只有空白页。

传入请求的头部还指定了一个〜4MB的内容长度,所以我相当肯定,它是在客户端上的东西,这是造成麻烦。
发送纯文本文件完全没有问题,它们完全按照它们应有的方式到达。

由于编写JavaScript和在网络上工作不在我的日常工作领域,所以很可能我做了一些基本上是错误的。

回答

2

我会怀疑两件事情,你可以尝试一下:

  • 检查的MIME类型对过程的两端,如果它得到某种方式错位,你有你的答案
  • 您上传的内容被包裹成一个XMLHttpRequest - 您可能必须手动Base64编码/解码以摆脱PDF中的本地字节表示形式

希望这会对您有所帮助,祝您好运!

0

我找到了解决方案:在发送它们之前用Base64显式编码数据,并在接收端正确解码它们。

function uploadFile() { 
    var reader = new FileReader(); 
    var file = document.getElementById('uploadInput').files[0]; 
    console.log(file.size); 
    var xhr = new XMLHttpRequest(); 

    xhr.open('POST', 'custom?id=upload'); 
    xhr.setRequestHeader("Content-Type", "text/plain; charset=x-user-defined"); 
    xhr.overrideMimeType('text/plain; charset=x-user-defined'); 
    reader.onload = function(evt) { 
     var encoded = window.btoa(evt.target.result); 
     xhr.send(encoded); 
    }; 
    reader.readAsBinaryString(file); 
} 

我写这让任何人,谁得到了同样的问题,知道我的解决方案。