我想通过拖放文件上传功能扩展现有应用程序。该应用程序基于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上找到我的测试应用的完整源代码。
答案 0 :(得分:2)
你错过了一个方法调用 - multipartRequest.parseFileNames()。 你需要在#getFiles()。
之前完成请参阅http://wicketinaction.com/2012/11/uploading-files-to-wicket-iresource/