通过JavaScript上传文件:服务器上的文件无效

时间:2016-07-06 08:42:26

标签: javascript java html5 file-upload

我试图使用此JS-Snippet上传二进制文件(PDF特定):

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时,我没有达到预期的~3MB,而是大约4MB,因为我只有空白页。
传入请求的标题还指定了大约4MB的内容长度,所以我相当肯定,它是客户端的东西,这导致了麻烦。
发送纯文本文件完全没有问题,它们完全按照预期到达
由于编写JavaScript和在网络中工作不在我的日常工作领域,因此很有可能我做了一些基本错误的事情。

2 个答案:

答案 0 :(得分:2)

我怀疑你可以尝试两件事:

  • 检查流程两端的MIME类型,如果它以某种方式损坏你的答案
  • 您的上传内容被包装到XMLHttprequest中 - 您可能需要手动进行Base64编码/解码以摆脱PDF中的本机字节表示

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

答案 1 :(得分: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);
}

我写这篇文章是为了让任何遇到同样问题的人知道我的解决方案。