【发布时间】:2011-09-14 06:50:19
【问题描述】:
我正在将 Spring 与 DWR 一起使用。我想返回一个文件对象作为响应,但是我将文件(要发送)保存在服务器临时位置,然后将其位置作为 href 发送到客户端的锚标记,但是我想知道是否有办法抛出在响应对象上直接向浏览器提交文件,而不将其临时保存在服务器上。
我预计是否可以通过 DWR 发送文件作为响应。
【问题讨论】:
标签: java spring httpwebresponse dwr response.write
我正在将 Spring 与 DWR 一起使用。我想返回一个文件对象作为响应,但是我将文件(要发送)保存在服务器临时位置,然后将其位置作为 href 发送到客户端的锚标记,但是我想知道是否有办法抛出在响应对象上直接向浏览器提交文件,而不将其临时保存在服务器上。
我预计是否可以通过 DWR 发送文件作为响应。
【问题讨论】:
标签: java spring httpwebresponse dwr response.write
【讨论】:
自从我使用 Spring 已经好几年了,我对 DWR 不熟悉,但你的问题的本质是 web 的基础。
答案是肯定的,你可以。实际上,您需要设置 HTTP 标头Content-Disposition: attachment,然后流式传输内容。所有这些都将在对原始请求的响应中(而不是发回链接)。
实现这一点的实际代码取决于您的情况,但这应该可以帮助您入门。
【讨论】:
您从 Java Script 调用方法,对吗?我真的不明白 Spring 在这个流程中是如何相关的,但据我所知,DWR 允许您生成 Java Script Stub 并直接从您的 java 脚本客户端代码在服务器上调用暴露 bean 的 Java 方法。
您可以逐字节读取文件并从您的 java 方法中返回它,只要它确实返回一个字节数组。 但是,您将如何处理客户端上的这个字节数组?
我只是认为在这个特定的流程中你不应该使用 DWR,而应该发出一个普通的 AJAX 请求(如果 DWR 可以以某种方式包装它以方便起见 - 很好)。这个请求不应该来自 DWRServlet,而是由一个常规的 servlet/一些基于 web 的框架来处理,比如 Spring MVC :) 一旦请求到达 servlet,使用
response.setHeader("Content-Disposition","attachment; filename=test.txt");
如前所述。
希望这会有所帮助, 祝你好运! 标记
【讨论】:
返回一个从客户端下载的excel示例:
//Java端:
public FileTransfer getExcel(Parametros param){
byte[] result = <here get data>;
InputStream myInputStream = new ByteArrayInputStream(result);
String excelFormat = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
FileTransfer dwrExcelFile = new FileTransfer("excel.xlsx", excelFormat, myInputStream);
return dwrExcelFile;
}
//Javascript端:
function downloadExcelFile() {
dwr.engine.setTimeout(59000);
var params = <params_to_send>;
<Java_class>.getExcel(params, {callback:function(dataFromServer) {
downloadExcelCallback(dataFromServer);
}});
}
function downloadExcelCallback(data) {
dwr.engine.openInDownload(data);
}
【讨论】: