java-使用Spark将内存中生成的.docx文件从服务器发送到客户端
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-使用Spark将内存中生成的.docx文件从服务器发送到客户端,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2395字,纯文字阅读大概需要4分钟。
内容图文
我正在使用Spark Java framework创建一个Web应用程序.前端是使用AngularJS开发的.
我想在服务器上(内存中)生成一个.docx文件,并将其发送到客户端进行下载.
为此,我创建了一个角度服务,在用户单击下载按钮后调用了以下功能:
functions.generateWord = function () {
$http.post('/api/v1/surveys/genword', data.currentSurvey).success(function (response) {
var element = angular.element('<a/>');
element.attr({
href: 'data:attachment;charset=utf-8;application/vnd.openxmlformats-officedocument.wordprocessingml.document' + response,
target: '_blank',
download: 'test.docx'
})[0].click();
});
};
在服务器上,此api调用将转发到以下方法:
public Response exportToWord(Response response) {
try {
File file = new File("src/main/resources/template.docx");
FileInputStream inputStream = new FileInputStream(file);
byte byteStream[] = new byte[(int)file.length()];
inputStream.read(byteStream);
response.raw().setContentType("data:attachment;chatset=utf-8;application/vnd.openxmlformats-officedocument.wordprocessingml.document");
response.raw().setContentLength((int) file.length());
response.raw().getOutputStream().write(byteStream);
response.raw().getOutputStream().flush();
response.raw().getOutputStream().close();
return response;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
我试图以多种不同方式解决此问题,但最终我总是得到一个看起来像这样的损坏的“ test.docx”:
解决方法:
通过使用斑点并在$http.post api调用中将响应类型指定为’arraybuffer’来解决该问题.据我所知,此解决方案唯一的缺点是它在IE上无法很好地运行,但这又是一个问题.
functions.generateWord = function () {
$http.post('/api/v1/surveys/genword', data.currentSurvey, {responseType: 'arraybuffer'})
.success(function (response) {
var blob = new Blob([response], {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'});
var url = (window.URL || window.webkitURL).createObjectURL(blob);
var element = angular.element('<a/>');
element.attr({
href: url,
target: '_blank',
download: 'survey.docx'
})[0].click();
});
};
我认为问题出在当我尝试使用以下方法创建URL时,字节流被编码为纯文本:
href: 'data:attachment;charset=utf-8;application/vnd.openxmlformats-officedocument.wordprocessingml.document' + response
从而破坏了它.
当使用blob代替时,我获得了到生成的字节流的“直接”链接,并且由于响应类型设置为“ arraybuffer”,因此未对其进行编码.
请注意,这只是我自己对原始代码出问题的原因进行推理.我可能错得很厉害,如果是这样,请随时纠正我.
内容总结
以上是互联网集市为您收集整理的java-使用Spark将内存中生成的.docx文件从服务器发送到客户端全部内容,希望文章能够帮你解决java-使用Spark将内存中生成的.docx文件从服务器发送到客户端所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。