我在绕过HTML5 webkitdirectory递归目录上传:
<form action="http://localhost:8080/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file_input" webkitdirectory="" directory="">
<input type="submit">
</form>在服务器端,我使用apache-commons-fileupload 1.3.1 (Streaming API)处理它:
@WebServlet(urlPatterns = "/upload")
public class DirUploadServlet extends HttpServlet
{
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
ServletFileUpload upload = new ServletFileUpload();
response.setContentType(MediaType.TEXT_PLAIN);
PrintWriter writer = response.getWriter();
try
{
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext())
{
FileItemStream item = iter.next();
if (!item.isFormField())
{
writer.println(item.getName());
}
}
}
catch (FileUploadException e)
{
throw new IOException(e);
}
}
}这对于没有子目录的目录很有效。但是,如果我尝试选择一个包含子目录的目录,请求将被正确发送,但是在服务器端我得到以下异常:
org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:1005)
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.close(MultipartStream.java:943)
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.close(MultipartStream.java:922)
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl$FileItemStreamImpl.close(FileUploadBase.java:866)
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:1017)
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.hasNext(FileUploadBase.java:1106)
at DirUploadServlet.doPost(DirUploadServlet.java:45)这个请求(来自Ubuntu Chromium)对我来说似乎是合法的:
------WebKitFormBoundaryMQ53uSzX0G6oZpWL
Content-Disposition: form-data; name="file_input"; filename="probadir/dir2/."
Content-Type: application/octet-stream
------WebKitFormBoundaryMQ53uSzX0G6oZpWL
Content-Disposition: form-data; name="file_input"; filename="probadir/file1"
Content-Type: application/octet-stream
------WebKitFormBoundaryMQ53uSzX0G6oZpWL
Content-Disposition: form-data; name="file_input"; filename="probadir/dir2/file2"
Content-Type: application/octet-stream
------WebKitFormBoundaryMQ53uSzX0G6oZpWL--该错误与Windows中的Google Chrome相同。IE和Firefox还没有这个功能。
发布于 2014-05-15 17:54:21
这里的问题不在于commons-fileupload,而在于请求或servlet容器本身。当我使用Glassfish 3.1.2和Servlet API以二进制形式注销请求时,我收到以下代码:
------WebKitFormBoundary7AVw8qF0sdCpYB1P
Content-Disposition: form-data; name="files[]"; filename="probadir/dir2/."
Content-Type: application/octet-stream
\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\
\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\
\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\
\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\等等,并且直到结束为止都是0字节。这就是为什么来自Servlet3的commons-fileupload API和Multipart API (例如request.getPart())都会抛出异常。
现在我认为唯一的解决方案不是使用标准的HTML表单提交,而是使用这里解释的JS单独提交文件:Keep Directory Structure When Uploading
https://stackoverflow.com/questions/23655503
复制相似问题