2015-12-07 69 views
2

我有一個類似於this one的實現,它允許調用者從文件系統請求特定文件。該文件不會經常更改,並且正在由移動應用程序下載。有沒有一種方法可以將其更改爲使用304 - 未修改的HTTP狀態代碼,以便客戶端在沒有更改時不必下載文件?如果是這樣,那麼這個方法的接口是否必須以某種方式改變接受日期?有沒有一些標準的方法來實現這個?如何修改Spring控制器以防止下載未更改的文件

@RequestMapping(value = "/files/datafile", method = RequestMethod.GET) 
public void getDataFile(HttpServletResponse response) { 
    try { 
     // get your file as InputStream 
     InputStream is = ...; 
     // copy it to response's OutputStream 
     org.apache.commons.io.IOUtils.copy(is, response.getOutputStream()); 
     response.flushBuffer(); 
    } catch (IOException ex) { 
     log.info("Error writing file to output stream. Filename was '{}'", fileName, ex); 
     throw new RuntimeException("IOError writing file to output stream"); 
    } 

} 

回答

0

使用Springs ETag Header支持。

你只需要這個過濾器添加到您的web.xml

<filter> 
    <filter-name>etagFilter</filter-name> 
    <filter-class>org.springframework.web.filter.ShallowEtagHeaderFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>etagFilter</filter-name> 
    <servlet-name>petclinic</servlet-name> 
</filter-mapping> 

,或者你在你的控制更加複雜:

+0

豈不客戶端代碼需要改變呢?如果客戶端不提供舊值的哈希值,服務器如何知道值沒有改變? –

+0

如果你的客戶是一個不老的瀏覽器,那麼它應該工作。關鍵在於,如果客戶端請求相同的url,那麼客戶端會將etag頭部發送回瀏覽器,而不是服務器可以決定是否必須發回內容或者只是沒有任何更改的狀態碼。 – Ralph

+0

客戶端是一個移動應用程序。 –