我想通過拖放文件上傳功能擴展現有的應用程序。該應用程序建立在Jetty + Wicket上。 DropzoneJS似乎是一個好方法。 Dropzone提供所有前端工作,我只需將它連接到後端。多部分POST請求不包含上傳的文件
事實證明,說起來容易做起來難。首先,我用Wicket quickstart創建了一個測試應用程序。我加了懸浮窗的主頁:
<!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>
懸浮窗簡單地從它的資源庫包括在內。在服務器上,我安裝在/上傳資源參考:
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
}
}
現在,這裏的問題,在上傳文件時,懸浮窗發送POST請求我的http://localhost:8080/upload。該請求被識別爲多部分請求,但文件參數不存在。一個空指針異常拋出進入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找到我的測試應用程序的完整源代碼。
謝謝,這是它:)好像我被卡在檢票前6.18時代......一直盯着這一個了一段時間! – verhage