FileSaver.js适用于文本文件,但不适用于二进制文件

时间:2015-07-21 23:26:53

标签: javascript blob filesaver.js

我有一个服务器API和一个从服务器下载文件的javascript前端。我使用FileSaver(https://github.com/eligrey/FileSaver.js)将下载的文档数据保存到本地文件系统。该解决方案适用于文本文件,但不适用于二进制文件。我已经验证了在这两种情况下服务器都会发送正确的内容。它的FileSaver似乎无法正确保存我的二进制内容。保存的内容或多或少是垃圾,文件大小错误。

使用Javascript:

    $http({
        method: 'GET',
        cache: false,
        url: <URL>,            
        headers: {
            'Content-Type': 'application/octet-stream',
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'accept-encoding': 'identity',
        }
    }).success(function (data, status, headers, config) {
        console.log(headers());
        console.log(headers('Content-Disposition'));
        var res = headers('Content-Disposition').split('=');
        console.log(res);
        var fileName = res[1];
        console.log(fileName);
        var blob = new Blob([data]);
        saveAs(blob, fileName);
     }

服务器端:

@GET
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response downloadDocument(@PathParam("documentId") UUID theid) {
    doc = <retrieve document>
    StreamingOutput stream = new StreamingOutput() {

        public void write(OutputStream output) throws IOException, WebApplicationException {
            try {                                      
               InputStream istream = new ByteArrayInputStream(doc.getData());
               System.out.println(doc.getData().length);
               IOUtils.copy(istream, output);

            } catch (Exception e) {
                throw new WebApplicationException(e);
            }
        }
    };

    return Response.ok(stream).header("Content-Disposition", "attachment; filename=" + doc.getName()).build();
}

0 个答案:

没有答案