临时解决方案:Apache FileUpload API中的InputStream关闭
我想读取content-disposition头的内容,但是request.getHeader("content-disposition")总是返回null,而request.getHeader("content-type")只返回第一行,例如multipart/form-data; boundary=AaB03x.
假设我收到以下头部:
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="submit-name"
Larry
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--AaB03x--
我想读取所有的内容分发头信息。怎么做?
谢谢。
编辑1:我真正想解决的问题是客户端发送的文件超过了最大大小限制,因为当您调用request.getPart("something")时,无论您传递什么部分名称,它都会抛出IllegalStateException异常,即使请求中不包含此参数名称。
示例:
Part part = request.getPart ("param");
String value = getValue (part);
if (value.equals ("1")){
doSomethingWithFile1 (request.getPart ("file1"))
}else if (value.equals (2)){
doSomethingWithFile2 (request.getPart ("file2"))
}
private String getValue (Part part) throws IOException{
if (part == null) return null;
BufferedReader in = null;
try{
in = new BufferedReader (new InputStreamReader (part.getInputStream (), request.getCharacterEncoding ()));
}catch (UnsupportedEncodingException e){}
StringBuilder value = new StringBuilder ();
char[] buffer = new char[1024];
for (int bytesRead; (bytesRead = in.read (buffer)) != -1;) {
value.append (buffer, 0, bytesRead);
}
return value.toString ();
}
我无法完成这个任务,因为如果客户端发送的文件超过最大大小,第一个调用getPart方法就会抛出异常(参见getPart() Javadoc),所以我无法知道我接收到了哪个文件。
这就是为什么我想读取content-disposition头部信息。我想读取参数“param”,以知道哪个文件抛出了异常。
编辑2: 好吧,使用发布Servlet 3.0规范的API,您无法控制前面的情况,因为如果文件引发异常,则无法读取文件字段名称。这是使用包装器的负面部分,因为许多功能消失了...还可以使用FileUpload动态设置MultipartConfig注释。
如果文件超过最大文件大小,API会抛出FileSizeLimitExceededException异常。该异常提供了2个方法来获取字段名称和文件名称。
但!!我的问题仍未解决,因为我想在同一表单中与文件一起发送的另一个参数的值。(前面示例中"param"的值)
编辑3: 我正在处理这个问题。一旦我编写好代码,我会在这里发布它!