我有一个服务器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();
}