多部分POST请求不包含上载的文件

时间:2016-07-30 11:25:15

标签: java file-upload wicket multipartform-data dropzone.js

我想通过拖放文件上传功能扩展现有应用程序。该应用程序基于Jetty + Wicket构建。 DropzoneJS似乎是个不错的选择。 Dropzone提供所有前端工作,我只需要将其连接到后端。

事实证明,说起来容易做起来难。首先,我使用Wicket quickstart创建了一个测试应用程序。我在主页上添加了dropzone:

<!DOCTYPE html>
<html>
    <head>
        <script src="https://rawgit.com/enyo/dropzone/master/dist/dropzone.js"></script>
        <link rel="stylesheet" href="https://rawgit.com/enyo/dropzone/master/dist/dropzone.css">
    </head>
    <body>
        <form action="/upload" class="dropzone"></form>
    </body>
</html>

Dropzone只是从其存储库中包含的。在服务器上,我在/ upload:

上安装了资源引用
public class FileUploadResourceReference extends ResourceReference
{
    public FileUploadResourceReference(String name)
    {
        super(FileUploadResourceReference.class, name);
    }

    @Override
    public IResource getResource()
    {
        return new FileUploadResource();
    }
}

FileUploadResource将处理上传文件的处理:

public class FileUploadResource extends AbstractResource
{
    @Override
    protected ResourceResponse newResourceResponse(Attributes attributes)
    {
        ServletWebRequest request = (ServletWebRequest) attributes.getRequest();

        try
        {
            MultipartServletWebRequest multipartRequest = request
         .newMultipartWebRequest(Bytes.megabytes(100), "ignored");
            Map<String, List<FileItem>> files = multipartRequest.getFiles();

            List<FileItem> fileItems = files.get("file");
            for (FileItem fileItem : fileItems)
            {
                saveFile(fileItem);
            }
        }
        catch (FileUploadException e)
        {
            e.printStackTrace();
        }

        return null;
    }

    private void saveFile(FileItem fileItem)
    {
        // not implemented
    }
}

现在问题是,在上传文件时,Dropzone会向我的http://localhost:8080/upload发送POST请求。请求被识别为多部分请求,但文件参数不存在。抛出空指针异常进入for循环:

java.lang.NullPointerException
    at com.test.FileUploadResource.newResourceResponse(FileUploadResource.java:31) ~[classes/:?]
    at org.apache.wicket.request.resource.AbstractResource.respond(AbstractResource.java:629) ~[wicket-core-7.4.0.jar:7.4.0]
    at org.apache.wicket.request.handler.resource.ResourceRequestHandler.respond(ResourceRequestHandler.java:105) ~[wicket-core-7.4.0.jar:7.4.0]
    at org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler.respond(ResourceReferenceRequestHandler.java:108) ~[wicket-core-7.4.0.jar:7.4.0]

我无法弄清楚这里发生了什么。根据Dropzone网站的说法,表格声明应该没问题。 Dropzone中的错误也许?似乎不太可能。一些拒绝多部分表单请求的Jetty配置参数?似乎极不可能,至少我从来没有听说过它。

您可以在GitHub上找到我的测试应用的完整源代码。

1 个答案:

答案 0 :(得分:2)

你错过了一个方法调用 - multipartRequest.parseFileNames()。 你需要在#getFiles()。

之前完成

请参阅http://wicketinaction.com/2012/11/uploading-files-to-wicket-iresource/