2012-10-01 71 views
0

我是ExtJS和Struts2的新手。我的要求是當用戶點擊一個鏈接時下載一個文件(在瀏覽器中保存文件或渲染內容)。我不知道文件類型我下載前(這可能是一個PDF格式,GIF,EXCEL,ZIP或別的東西),我已經構建以下AJAX要求使用Struts2和ExtJS下載文件

調用一個動作:

Ext.onReady(function() { 
     Ext.Ajax.request({ 
     url : 'action/download.do', 
     params : { 
      loc : path 
     }, 
     method : 'POST', 
     success: function(response, request) { 
      return; 
     } 
     }); 
    }); 

struts.xml中配置:

<action name="download" class="downloadAction" method="download" > 
     <result name="success" type="stream"> 
     <param name="contentType">application/octet-stream</param> 
     <param name="inputName">fileInputStream</param> 
     <param name="contentDisposition">attachment;</param> 
     <param name="bufferSize">1024</param> 
     </result> 
    </action> 

行動代碼:

public String documentDownload() { 
     String filePath = "/home/sasha/abc.pdf"; 
     try { 
     fileInputStream = new FileInputStream(new File(filePath)); 
     } catch (FileNotFoundException e) { 
     LOGGER.error(e.getLocalizedMessage(), e); 
     } 
     return SUCCESS; 
    } 

當我在Firebug中驗證響應時,它是「200 OK」。文件內容以垃圾格式顯示在「響應」選項卡下。

有人可以告訴我如何將內容保存爲文件?

+1

你想去哪裏文件類型的信息?如果你的意思是內容類型,你可以從你的動作中傳遞它們,比如' $ {content-Type}'你可以在動作類中設置內容類型 –

+0

文件類型可以是任何東西。我可能會從同一臺服務器獲得或可能請求遠程服務器。爲了讓這個簡單,我正在從本地機器讀取一個文件(「/home/sasha/abc.pdf」)。 – Sasha

+0

好吧,一旦你得到文件,你可以很容易地找到文件類型,並在相同的類型設置類型在你的行動類傳遞你的配置文件。 –

回答

0

您可以獲取調用contentType = ServletActionContext.getServletContext().getMimeType(file_name)的文件的內容類型,然後在您的struts.xml中使用contentType作爲參數。

BTW有超過獲取該文件的MIME類型的一種方式見http://www.rgagnon.com/javadetails/java-0487.html