文件上传的秘密(四)大小限制与进度
RFC1867规范中,对表单上传文件的大小和进度都没有作出规定,W3C的HTML规范的FileUpload对象(<input type="file"> 标签每出现一次,一个 FileUpload 对象就会被创建)也没有对表单中的文件大小作出限制,因此,这个问题还是留给了WEB应用服务器端开发人员。
HTTP请求提交到服务器端后,在未解析各boundary中的文件内容之前,是可以知道这次HTTP请求的总长度的,但是考虑到一个表单内可以容纳多个FileUpload对象,所以,只要发现解析的两个boundary内的字节数超过指定的数量,立即抛出一个运行期异常ThresholdException。重构后的的MultiPartFile类,增加了bytes和threshold成员变量,append方法中新增加3行代码,并且,其子类要显式调用super.append(…);
public void append(byte[] buff, int off, int len) throws IOException {bytes += len;if (threshold > 0 && bytes > threshold)throw new ThresholdException();}
public class ProgressListener {private FileUploadParser fileUploadParser;public ProgressListener(FileUploadParser fileUploadParser) {super();this.fileUploadParser = fileUploadParser;}public double progress() {return fileUploadParser.getReadBytes()*1.0 / fileUploadParser.getContentLength();}}