2012-08-30 59 views
1

我正在使用spring編寫REST webserivce。我必須在回覆中返回一個文件。使用java的基於REST的web服務中的文件響應

它是一個GET調用,當用戶輸入URL時,用戶應該在瀏覽器中顯示下載部分。

我不知道控制器中應該有什麼樣的返回類型。我是否必須指定任何內容類型我的代碼?

回答

0

我用下面的代碼片段

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(); 
    } 

這是在一個更線程發現

how to write a file object on server response and without saving file on server?

0

您的控制器方法可以具有您想要的任何名稱,它會返回一個字符串,其中的url名稱在您要加載的視圖(本例中爲下載部分)定義的views.xml中定義。 所以你的控制器看起來是這樣的:

@Controller 
public class MyController { 

    @RequestMapping(value = "/downloads", method = RequestMethod.GET) 
    public String getDownloadSection() { 
     System.out.println("getting downloads"); 
     return "downloads/index"; 
    } 
} 

你views.xml應包含標籤:

<definition extends="default" name="downloads/index"> 
<put-attribute name="body" value="/WEB-INF/views/downloads/index.jspx"/> 
</definition> 

延伸=「默認」是平鋪定義,應該是在你的佈局。 xml

我認爲這是關於它。如果你做了一個GET請求//你的/下載它應該打印消息。

這應該回答你的問題,我希望:)

+0

感謝您的幫助。我也會嘗試這:) – user1332962

4

我有類似的要求在我的項目中。我用下面的代碼片段

@Controller 
@RequestMapping("/reports") 
public class ReportsController { 

    protected static String PRODUCTIVITY_REPORT_FILE = "productivityReportFile"; 

    @Resource(name="propertyMap") 
    protected Map<String, String> propertyMap; 

    @RequestMapping(value="/cratl/productivity_report", method=RequestMethod.GET, produces="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 
    public @ResponseBody byte[] getProductivityReport() 
      throws Exception { 
     byte[] reportBytes = null; 
     try { 
      File reportFile = new File(propertyMap.get(PRODUCTIVITY_REPORT_FILE)); 
      if (reportFile != null && reportFile.exists()) { 
       InputStream reportInputStream = new FileInputStream(reportFile); 
       long length = reportFile.length(); 
       reportBytes = new byte[(int)length]; 
       int offset = 0; 
       int numRead = 0; 
       while (offset < reportBytes.length 
         && (numRead = reportInputStream.read(reportBytes, offset, reportBytes.length-offset)) >= 0) { 
        offset += numRead; 
       } 
       if (offset < reportBytes.length) { 
        throw new Exception("Could not completely read file "+ reportFile.getName()); 
       } 
       reportInputStream.close(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return reportBytes; 
    } 

我希望它能幫助你

+0

任何人都可以解釋爲什麼這一個得分-1 –

相關問題