2011-09-14 109 views
2

我正在使用DWR的Spring。我想返回一個文件對象作爲響應,但是我保存文件(待發送)在服務器臨時位置,然後發送它的位置作爲客戶端錨定標記的href,但我不知道是否有辦法扔掉直接將文件保存到響應對象上的瀏覽器,而不將其臨時保存在服如何在服務器響應上寫入文件對象並且不在服務器上保存文件?

我期望如果有可能通過DWR發送文件作爲響應的方式。

回答

4
 
public ModelAndView writeFileContentInResponse(HttpServletRequest request, HttpServletResponse response) throws IOException { 

     FileInputStream inputStream = new FileInputStream("FileInputStreamDemo.java"); //read the file 

     response.setHeader("Content-Disposition","attachment; filename=test.txt"); 
     try { 
      int c; 
      while ((c = inputStream.read()) != -1) { 
      response.getWriter().write(c); 
      } 
     } finally { 
      if (inputStream != null) 
       inputStream.close(); 
       response.getWriter().close(); 
     } 

     } 
+0

但是新的FileInputStream(「FileInputStreamDemo.java」);需要一個保存的文件....而我想要不要創建一個文件,而只是將數據寫入響應流。它可以做些什麼? – Sankalp

+1

如果您的響應內容是動態的(字符串),則將內容放入ByteArrayInputStream中,然後通過塊 – Pokuri

+0

將新的FileInputStream(「FileInputStreamDemo」)寫入響應 - >寫入器塊。java「);用於從服務器臨時位置讀取保存的文件 – Rupok

0

我已經使用Spring已經有好幾年了,而且我對DWR並不熟悉,但是您的問題的本質是網絡的基礎。

答案是肯定的,你可以。實際上,您需要設置HTTP標頭Content-Disposition: attachment,然後流式傳輸內容。所有這些都將回應原始請求(而不是發回鏈接)。

實現此目的的實際代碼將取決於您的情況,但這應該讓您開始。

+0

DWR是直接Web遠程通信,我們只是在服務器上調用一個方法,然後將響應發回給它,我預計是否有辦法發送文件作爲響應。 – Sankalp

0

你從Java腳本調用方法,對吧?我並不真正瞭解Spring如何與此流程相關,但據我所知,DWR允許您生成Java腳本存根,並直接從您的java腳本客戶端代碼直接在服務器上調用公開的bean的Java方法。

只要它真的返回一個字節數組,就可以逐字節讀取文件並從java方法返回。 但是,你會如何處理客戶端上的這個字節數組?

我只是想在這個特定的流程中,你不應該使用DWR,而是發出一個規範的AJAX請求(如果DWR可以方便地包裝它 - 爲了方便 - 很好)。該請求不應該來DWRServlet,而是由一個普通的servlet被起訴/一些基於Web的框架,如Spring MVC :) 一旦請求到達這個servlet,使用

response.setHeader(「內容 - 處置「,」附件;文件名= test.txt「);如已經陳述的那樣,可以使用如下的方法:

希望這會有所幫助, 祝你好運! 馬克

+0

絕對正確Mark,我通過js和spring調用它是獨立的它我正在尋找解決方案,從服務器讀取一些數據並用excel迴應客戶端文件,無需在服務器上保存文件,即使我得到一個AJAX發送請求,也不需要DWR調用...可以正常工作,你的Solutn說:「你可以逐字節讀取文件,並... 「,親愛的馬克我不想寫任何文件,除了迴應沒有保存它的任何地方 – Sankalp

+1

不,我想我只是可以清楚地表達我的exlanation :)。我的意思是,如果你讀取服務器上的文件在bean的方法由DWR公開,例如:class MyBean {byte [] f(){return read(「file.txt」}} - 這會將文件發送到java腳本端,但是您再也不能對它做任何有用的操作,所以對我來說這不是一個解決方案,這就是我想說的話,無論如何,我相信,Ajax w沒有DWR是一種去這裏的方式。 –

+1

如果你只是不想將文件保存在服務器上 - 實際上你並不需要這麼做。一旦你在內存中有一個字節流,你可以將它發送給客戶端,而不需要將它存儲在硬盤上。訣竅是你不要發送,而是直接發送文件。當瀏覽器看到附件時,它將打開程序來處理該文件/報價以下載它)。這樣,文件就不存儲在服務器上了... –

-1

它會返回一個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); 
} 
相關問題