2016-05-12 168 views
0
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws Exception{ 
... 
HttpServletRequest req = (HttpServletRequest) request; 
if ("POST".equals(req.getMethod())) 
{ 
    long bytesTransferred = request.getContentLength(); 
    ... 
} 
else 
{ 
    long bytesTransferred = request.getContentLength(); 
    ... 
} 

當我發送GET請求來獲取文件時,如何獲取文件大小? 我試過使用request.getContentLength(),它總是返回-1。如果我使用POST上傳文件,它工作正常,但仍不會返回確切的文件大小。如何獲取GET請求的文件大小

有什麼想法?謝謝。

回答

3

當我發送GET請求來獲取文件時,如何獲取文件大小?

當服務器向客戶端發送文件(假設客戶端是Web瀏覽器)時,它「知道」文件的大小,因爲它將內容寫入ServletResponse對象的OutputStream。當您將文件發送到cliet時,通過在servlet中調用response.setContentLength(<length>)來設置文件的大小。這將設置相應的http響應的標頭Content-LengthHere is the JavaDoc of the setContentLength() method。然後,您可以使用您喜歡的瀏覽器的developer tools來查看文件的大小或發送到瀏覽器的任何內容。

我嘗試使用request.getContentLength(),它總是返回-1

HeregetContentLength()方法的ServletRequest類的的JavaDoc:

返回的長度,以字節,請求主體使其可用,如果長度未知,則返回-1。

當您向服務器發送POST請求時,請求數據在請求的主體中發送。所以getContentLength()方法返回一個對應於數據長度的值。

但是,GET請求將附加到請求的URL的請求數據發送爲例如param1=paramValue1&param2=paramValue2&...。這意味着請求正文中沒有數據。所以該方法按照指定返回-1。

0

如果您使用HTML表單提交的要求,你應該明確地聲明POST方法,像這樣:

<form enctype="multipart/form-data" method="post" name="formName" 
    action="<url>"> 
    <input type="file" contenteditable="false" multiple> 
    <input type="submit" value="Submit"> 
</form>