2016-05-12 159 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>