1



我现在正在使用 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>

谁能帮我解决这个问题?

4

0 回答 0