我正在使用 Spring 和 DWR 。我想返回一个文件对象作为响应,但是我将文件(要发送)保存在服务器临时位置,然后将其位置作为 href 发送到客户端的锚标记,但是我想知道是否有办法抛出在响应对象上直接向浏览器提交文件,而无需将其临时保存在服务器上。
我预计是否可以通过 DWR 发送文件作为响应。
我正在使用 Spring 和 DWR 。我想返回一个文件对象作为响应,但是我将文件(要发送)保存在服务器临时位置,然后将其位置作为 href 发送到客户端的锚标记,但是我想知道是否有办法抛出在响应对象上直接向浏览器提交文件,而无需将其临时保存在服务器上。
我预计是否可以通过 DWR 发送文件作为响应。
公共 ModelAndView writeFileContentInResponse(HttpServletRequest 请求,HttpServletResponse 响应)抛出 IOException { FileInputStream inputStream = new FileInputStream("FileInputStreamDemo.java"); //读取文件 response.setHeader("Content-Disposition","attachment; filename=test.txt"); 尝试 { 诠释 c; 而 ((c = inputStream.read()) != -1) { response.getWriter().write(c); } } 最后 { 如果(输入流!= null) inputStream.close(); response.getWriter().close(); } }
自从我使用 Spring 以来已经有好几年了,我对 DWR 不熟悉,但你的问题的本质是 web 的基础。
答案是肯定的,你可以。实际上,您需要设置 HTTP 标头Content-Disposition: attachment,然后流式传输内容。所有这些都将在对原始请求的响应中(而不是发回链接)。
实现这一点的实际代码将取决于您的情况,但这应该可以帮助您入门。
您从 Java Script 调用该方法,对吗?我并不真正了解 Spring 在这个流程中是如何相关的,但据我所知,DWR 允许您生成 Java Script Stubs 并直接从您的 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);
}