2014-05-14 10 views
0
나는 HTML5 webkitdirectory 재귀 디렉토리 업로드 주위를 재생하고

:HTML5 디렉토리 업로드 자바 서블릿은 처리

: 서버 측에서

<form action="http://localhost:8080/upload" method="post" enctype="multipart/form-data"> 
    <input type="file" name="file_input" webkitdirectory="" directory=""> 
    <input type="submit"> 
</form> 

나는 아파치 - 평민 - 파일 업로드 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) 

(우분투 크롬에서) 요청이 나를 위해 합법적 인 것 같다을 :

------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 크롬과 동일합니다. IE와 Firefox에는 아직이 기능이 없습니다.

답변

0

여기의 문제는 commons-fileupload가 아니라 요청 또는 서블릿 컨테이너 자체의 문제입니다. 끝까지

------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 바이트 : 내가 글래스 피시 3.1.2 서블릿 API를 사용하여 바이너리 형태로 요청을 로그 아웃 할 때, 나는이 코드를받을 수 있습니다. 이것이 Servons 3의 commons-fileupload API와 Multipart API (예 : request.getPart())가 예외를 throw하는 이유입니다.

이제 유일한 해결책은 표준 HTML 양식 제출을 사용하지 않고 여기에서 설명한 JS와 별도로 파일을 제출하는 것입니다. Keep Directory Structure When Uploading