我现在正在使用 Servlet 编码来处理文件上传请求。
我使用 tukey 的 UrlRewriteFilter 来帮助我重写 URL,并且我想使用 servlet 3.0 的 fileupload 支持来完成文件保存操作。
但问题是,在 UrlRewriteFilter 向 servlet 分发后,servlet 无法通过调用 request.getParts() 或 request.getPart("partname") 接收多部分数据。
这是 urlrewrite.xml 中的 xml 代码:
<rule>
<note>处理文件上传请求</note>
<condition type="method">POST</condition>
<from>^/upload/(\w+?)/(\w+?)/([a-zA-Z_0-9/\.\-]*)$</from>
<set type="parameter" name="db">$1</set>
<set type="parameter" name="bucket">$2</set>
<set type="parameter" name="filename">$3</set>
<to>/servlet/uploadFileServlet</to>
</rule>
这是文件上传servlet的主要代码,看起来很简单^_^:
@WebServlet(urlPatterns = "/servlet/uploadFileServlet")
@MultipartConfig()
public class UploadFileServlet extends HttpServlet {
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Collection<Part> parts = request.getParts();
System.out.println("parts : " + parts);
System.out.println("params : " + request.getParameterMap());
request.getPart("filepart").write("myfile.txt");
}
}
这是选择文件并提交的Jsp代码。对比有两种形式。第一个直接向 servlet 发送请求,然后 servlet 可以接收多部分数据。但是第二个,其 url 与 urlrewrite 角色匹配,调度到 servlet,而 servlet 无法接收多部分数据,这就是问题所在。
<form action="servlet/uploadFileServlet?db=game_dev&bucket=videos&filename=hello.txt"
enctype="multipart/form-data" method="post">
<input type="file" name="filepart" />
<input type="text" name="myinfo" value="hello123下午好hello">
<input type="submit" />
</form>
<form action="upload/game_dev/videos/helloworld.txt"
enctype="multipart/form-data" method="post">
<input type="file" name="filepart" />
<input type="text" name="myinfo" value="hello456下午好lala">
<input type="submit" />
</form>
谁能帮我解决这个问题?