- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 javascript's Blob object 下载文件,但奇怪的事情正在发生。首先,我使用 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 的控制台中调试它时,我注意到当我尝试转换 response response 对象和 Blob 对象之间的大小存在差异strong> 到 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
,下载文件的大小似乎是 7836 字节,而且似乎也已损坏。所以,我的问题是为什么它不起作用以及为什么大小不同?我使用 Chrome 版本 40.0.2214.111(64 位),但在 Firefox 35.0.1 中我有相同的行为。
提前谢谢你。
附言我客户端的完整代码来自 SO question我在上面提到过:
$.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
关于javascript - 通过将 JAX-RS 与 ajax 和 javascript 的 blob 对象一起使用来下载文件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28438800/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!