Gab*_*mas 6 java servlets multipart http-headers
TEMPORARY求助: 在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--
Run Code Online (Sandbox Code Playgroud)
我想阅读所有内容处置标头.怎么样?
谢谢.
编辑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 ();
}
Run Code Online (Sandbox Code Playgroud)
我不能这样做,因为如果客户端发送的文件超过最大大小,第一次调用getPart将抛出异常(请参阅getPart()Javadoc),所以我不知道我收到了哪个文件.
这就是我想阅读内容处置标题的原因.我想读取参数"param"以了解哪个文件抛出了异常.
EDIT2:嗯,使用发布Servlet 3.0规范的API,您无法控制之前的情况,因为如果文件抛出异常,则无法读取文件字段名称.这是使用包装器的负面部分,因为许多功能都消失了......同样使用FileUpload,您可以动态设置MultipartConfig注释.
如果文件超过最大文件大小,则api会抛出FileSizeLimitExceededException异常.该异常提供了两种获取字段名称和文件名的方法.
但!!我的问题仍未解决,因为我想读取与该文件一起发送的另一个参数的值.(前一个例子中"param"的值)
编辑3:我正在研究这个问题.一旦我编写代码,我就会在这里发布它!
request.getHeader ("content-disposition")在您的情况下将返回null,因为Content-Disposition标题出现在HTTP POST正文中,因此需要单独处理它们.实际上,Content-Disposition它只是一个有效的HTTP响应头.作为请求的一部分,它永远不会被视为标题.
你最好使用像Commons FileUpload这样的文件上传库或Servlet Spec 3.0的内置文件上传功能来读取Content-Disposition标题(间接).实现Servlet Spec 3.0所需的文件上载功能所需的Java EE 6容器通常使用Apache Commons FileUpload.
如果你想出于某些正当理由忽略这些库而不是自己阅读标题,那么我建议你查看Apache Commons FileUpload类的方法parseHeaderLine和getParsedHeaders方法FileUploadBase.请注意,这些方法实际上是从InputStream与之关联的读取HttpServletRequest,而您无法读取该流两次.如果您想首先阅读Content-Disposition代码中的标题,然后使用Apache Commons FileUpload来解析请求,则必须传递一个ServletRequestWrapper包装副本(如果原始请求到FileUpload API).相反的顺序还要求您创建原始请求的副本,并将ServletRequestWrapper此副本包装到FileUpload API.总的来说,这是糟糕的设计,因为在内存(或磁盘)上复制整个流只是为了读取请求体两次是没有意义的.