如何阅读内容处置标题的内容?

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:我正在研究这个问题.一旦我编写代码,我就会在这里发布它!

Vin*_*lds 5

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类的方法parseHeaderLinegetParsedHeaders方法FileUploadBase.请注意,这些方法实际上是从InputStream与之关联的读取HttpServletRequest,而您无法读取该流两次.如果您想首先阅读Content-Disposition代码中的标题,然后使用Apache Commons FileUpload来解析请求,则必须传递一个ServletRequestWrapper包装副本(如果原始请求到FileUpload API).相反的顺序还要求您创建原始请求的副本,并将ServletRequestWrapper此副本包装到FileUpload API.总的来说,这是糟糕的设计,因为在内存(或磁盘)上复制整个流只是为了读取请求体两次是没有意义的.