RS与ajax和javascript的blob对象一起,不起作用
我试图通过使用JavaScript的Blob对象下载文件,但有些奇怪的事情正在发生。 首先我使用JAX-RS从后端发送文件,这是我的代码:
Workbook wb = new HSSFWorkbook();
//creating workbook...
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
wb.write(bos);
bos.close();
} catch(Exception e) {
e.printStackTrace();
}
byte[] bytes = bos.toByteArray();
return Response.ok(bytes).header("Content-Disposition", "attachment; filename=" + "test.xls").build();
bos
是我从Apache POI工作簿创建的'ByteArrayOutputStream'对象。 如果我使用常规方式下载此文件,即将浏览器指向JAX-RS资源,一切正常,但是当我尝试使用此解决方案https://stackoverflow.com/a/23797348/947111时,它不起作用,文件被下载损坏。
当我尝试在Chrome的控制台中调试时,我注意到当我尝试将响应转换为Blob时, 响应对象和Blob对象之间的大小存在差异。 响应的大小是4096字节,
Date: Tue, 10 Feb 2015 17:32:27 GMT
Server: WildFly/8
Connection: keep-alive
X-Powered-By: Undertow/1
Content-Length: 4096
Content-Disposition: attachment; filename=test.xls
Content-Type: application/vnd.ms-excel
但是当我执行var blob = new Blob([response], { type: type });
, blob变成7836字节的大小,即当我在控制台中执行blob.size
时,我得到这个大小。 下载的文件大小为7834字节。 但是,当我停止调试器在这一点var downloadUrl = URL.createObjectURL(blob);
并将浏览器指向另一个选项卡以downloadURL
URL,下载的文件大小似乎为7836字节,并且似乎也已损坏。 所以,我的问题是为什么它不起作用,为什么它的大小有所不同? 我使用Chrome 40.0.2214.111(64位) ,但在Firefox 35.0.1中我有相同的行为。
先谢谢你。
PS我从上面提到的SO问题的客户端完整代码:
$.ajax({
type: "POST",
url: url,
data: params,
success: function(response, status, xhr) {
// check for a filename
var filename = "";
var disposition = xhr.getResponseHeader('Content-Disposition');
if (disposition && disposition.indexOf('attachment') !== -1) {
var filenameRegex = /filename[^;=n]*=((['"]).*?2|[^;n]*)/;
var matches = filenameRegex.exec(disposition);
if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
}
var type = xhr.getResponseHeader('Content-Type');
var blob = new Blob([response], { type: type });
if (typeof window.navigator.msSaveBlob !== 'undefined') {
// IE workaround for "HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed."
window.navigator.msSaveBlob(blob, filename);
} else {
var URL = window.URL || window.webkitURL;
var downloadUrl = URL.createObjectURL(blob);
if (filename) {
// use HTML5 a[download] attribute to specify filename
var a = document.createElement("a");
// safari doesn't support this yet
if (typeof a.download === 'undefined') {
window.location = downloadUrl;
} else {
a.href = downloadUrl;
a.download = filename;
document.body.appendChild(a);
a.click();
}
} else {
window.location = downloadUrl;
}
setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup
}
}
});
你的二进制数据被转换为文本,这会破坏你的数据。
目前,jQuery.Ajax无法完成类型化的ajax请求,因此您需要使用裸XMLHttpRequest并将responseType
设置为blob
然后将XMLHttpRequest.response
作为blob的数据
上一篇: RS together with ajax and javascript's blob object, doesn't work
下一篇: Using jQuery's ajax method to retrieve images as a blob