【问题标题】:how to write a file object on server response and without saving file on server?如何在服务器响应上写入文件对象而不在服务器上保存文件?
【发布时间】:2011-09-14 06:50:19
【问题描述】:

我正在将 Spring 与 DWR 一起使用。我想返回一个文件对象作为响应,但是我将文件(要发送)保存在服务器临时位置,然后将其位置作为 href 发送到客户端的锚标记,但是我想知道是否有办法抛出在响应对象上直接向浏览器提交文件,而不将其临时保存在服务器上。

我预计是否可以通过 DWR 发送文件作为响应。

【问题讨论】:

    标签: java spring httpwebresponse dwr response.write


    【解决方案1】:
    公共 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(); } }

    【讨论】:

    • 但又是 new FileInputStream("FileInputStreamDemo.java");需要一个保存的文件....虽然我不想在任何地方创建文件,而只是将数据写入响应流。能不能做到?
    • 如果您的响应内容是动态的(字符串),则将内容放入 ByteArrayInputStream,然后逐块写入 response->writer 块
    • new FileInputStream("FileInputStreamDemo.java");用于从服务器临时位置读取保存的文件
    【解决方案2】:

    自从我使用 Spring 已经好几年了,我对 DWR 不熟悉,但你的问题的本质是 web 的基础。

    答案是肯定的,你可以。实际上,您需要设置 HTTP 标头Content-Disposition: attachment,然后流式传输内容。所有这些都将在对原始请求的响应中(而不是发回链接)。

    实现这一点的实际代码取决于您的情况,但这应该可以帮助您入门。

    【讨论】:

    • DWR 是直接网络远程处理,我们只是在服务器上调用一个方法并将响应发送回它,我希望是否有办法将文件作为响应发送。
    【解决方案3】:

    您从 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");

    如前所述。

    希望这会有所帮助, 祝你好运! 标记

    【讨论】:

    • 绝对正确的标记,我确实通过 js 调用并且 spring 独立于它我正在搜索从服务器读取一些数据并使用 excel 文件响应回客户端的解决方案,而不保存文件反正服务器。是的,即使我收到 AJAX 发送请求,也不需要 DWR 调用……可以正常工作。你的解决方案说“你可以逐字节读取文件并且......”,亲爱的标记,我不想在任何地方写任何文件,除了响应而不保存它。
    • 不,我想我可以清楚地表达我的解释:)。我的意思是如果你在DWR暴露的bean方法中读取服务器上的文件,例如:class MyBean {byte [] f() { return read("file.txt" }} - 这会将文件发送到java脚本端,但是你不能用它做任何有用的事情,所以对我来说这不是一个解决方案。这就是我想说的。无论如何,我相信,没有Ajax DWR 是一种方法。
    • 如果您只是不想将文件保存在服务器上 - 实际上您不需要这样做。一旦你在内存中有一个字节流,你就可以将它发送到客户端,你不需要将它存储在硬盘上。诀窍是您不发送 而是直接发送文件。当浏览器看到附件时,它会打开程序来处理这个文件/提供下载它)这样,文件就不会存储在服务器上......
    【解决方案4】:

    返回一个从客户端下载的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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2014-03-27
      • 1970-01-01
      相关资源
      最近更新 更多