在 Servlet 3.0 中处理 multipart/form-data 请求的两个辅助方法 |
Two Assistant Methods for Dealing with multipart/form-data Request in Servlet 3.0 |
Servlet 3.0 引入了 javax.servlet.http.Part 接口,从而提供了对 multipart/form-data 类型的 HTTP 请求的直接支持,我们从此就可以摆脱诸如 Apache Commons FileUpload 之类的第三方依赖。然而,该支持太过单纯,所以还要多做点事情,以便能更有效地进行工作。我将在本文中介绍两个辅助方法。 |
Servlet 3.0 comes with out-of-the-box support for handling HTTP request of type multipart/form-data by introducing of javax.servlet.http .Part interface, freeing us from 3rd party dependencies such as Apache Commons FileUpload. However, the support so pure that we still need to do a little more work to get us work more effective. I'll demostrate two assistant methods in this article. |
首先,Servlet 3.0 没有提供方法将 Part 对象专为字符串。multipart/form-data 请求也可能包含字符串参数。在这种情况下,我们可以写一个工具方法来从 Part 对象读取字节,然后将其解析为字符串。为了方便,还可以让这个方法能处理最常见的 application/x-www-form-urlencoded 请求: |
First, there's no method to translate a Part object to a string value in Servlet 3.0. A multipart/form-data request may also contain string parameters. In this case, we can wrtie a utility method to read bytes from the Part object and parse them to a string value. For convenience we also enable the method to handle the most common application/x-www-form-urlencoded request: |
-
-
-
-
-
-
-
-
-
-
-
- public static String getParameter(HttpServletRequest req, String name,String charse) {
-
- String value = req.getParameter(name);
- if (value != null) {
- return value;
- }
-
- try {
- Reader in = new InputStreamReader(part.getInputStream(), charset);
- StringBuilder sb = new StringBuilder();
- char[] buffer = new char[256];
- int read = 0;
- while ((read = in.read(buffer)) != -1) {
- sb.append(buffer, 0, read);
- }
- in.close();
- return sb.toString();
- } catch (Exception ex) {
- return null;
- }
- }
|
类似地,可以写一个 getParameterValues 方法去处理名称相同的多个参数,所以就不在这里列出代码了。第二个辅助方法用于从 Part 对象获取文件名。Part 接口并没有提供这种方法,但我们可以容易地从头部提取出文件名: |
In the similar manner we can write a getParameterValues method to handle multiple parameter with the same name, so I'm not going to list the code here. The sencond assistant method is for getting the filename from a Part object. The Part interface doesn't provide such a method, but we can easily extract the filename from the header: |
- private static final String FILENAME_KEY = "filename=\"";
-
-
-
-
-
-
-
- public static String getFileNameFromPart(Part part) {
- String cdHeader = part.getHeader("content-disposition");
- if (cdHeader == null) {
- return null;
- }
- for (String s : cdHeader.split("; ")) {
- if (s.startsWith(FILENAME_KEY)) {
-
-
-
- String path = s.substring(FILENAME_KEY.length(),
- s.length() - 1).replaceAll("\\\\", "/");
- return path.substring(path.lastIndexOf("/") + 1);
- }
- }
- return null;
- }
|