2017-10-03 11 views
1

나는 FormPanel과 3 개의 FileUpload 개체로 만든 양식이 있습니다. 세 개의 FileUpload 오브젝트는 다른 유형의 2 진 파일을 나타냄니다. 상당히 많은 테스트를 거쳤으며, 파일은 세 개의 FileUpload 개체에 (위에서 아래로) 추가 된 순서대로 항상 목록에 배치되었습니다.GWT에서 Multipart 양식 데이터가 양식에있는 순서대로 전송되도록 보장됩니까?

file upload example

는 점이다 그래서, 예를 들어, 파일 1, 2, 3 아래 양식에 순서대로 서버에 도착 (I는 다양한 파일 20 ~ 30 회를 실행 한) 보장 됐어? 또는 어떻게 든 레이블을 붙일 방법을 찾아야합니까?

+1

순서가 확실하지 않지만 FileItemIterator를 사용하여 반복 할 때 필드 이름을 확인할 수 있으므로 어느 필드가 처리되는지 알 수 있습니다. 파일 선택기에서 위젯 당 하나가 아닌 여러 개의 파일을 선택할 수도 있습니다. 그것이 마지막으로 사용한 것을 말하지만, 파일 위젯 이전에 파싱 된 필드는 숨겨져있었습니다. – WLGfx

+0

위의 예제를 사용하면 필드 이름에 "File 1"등이 표시됩니다. 나는 파일의 이름을 미리 알지 못할 것이고 모두 같은 유형이다. –

+1

예, 맞습니다. getFieldName()은 필드 이름을 반환하고 getName()은 업로드의 파일 이름을 반환합니다. – WLGfx

답변

1

FileItemIterator를 사용할 때 양식의 각 항목을 확인할 수 있습니다. 내가 아는 한 그들은 순서대로 HTML에 있습니다.

필자가 작성한 이전 함수 에서처럼 반복기가 양식 필드인지 또는 업로드 파일인지 알려줍니다.

파일 업로드를 처리 할 때 getFieldName()을 사용하여 양식 필드를 식별하고 getName()을 사용하여 클라이언트에서 파일 이름을 처리하십시오.

web.xml 파일의 매개 변수에 서블릿을 할당하는 데 어려움이 있습니다.

다음 코드가 도움이되기를 바랍니다.

<context-param> 
    <!-- max size of the upload request --> 
    <param-name>maxSize</param-name> 
    <param-value>3145728</param-value> 
</context-param> 
<context-param> 
    <!-- max size of any uploaded file --> 
    <param-name>maxFileSize</param-name> 
    <param-value>1024000</param-value> 
</context-param> 
<context-param> 
    <!-- Useful in development mode to slow down the uploads in fast networks. 
     Put the number of milliseconds to sleep in each block received in the server. 
     false or 0, means don't use slow uploads --> 
    <param-name>slowUploads</param-name> 
    <param-value>200</param-value> 
</context-param> 

<servlet> 
    <servlet-name>fileUpload</servlet-name> 
    <servlet-class>com.parity.mediamanager.server.FileUploadServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>fileUpload</servlet-name> 
    <url-pattern>/fileupload</url-pattern> 
</servlet-mapping> 

public class FileUploadServlet extends HttpServlet { 

    private static final long serialVersionUID = -6988332690679764038L; 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     super.doGet(req, resp); 
    } 

    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws IOException { 

     String path = "/home/tomcat/engage/media/"; 
     String user = ""; 

     if (ServletFileUpload.isMultipartContent(request)) { 

      FileItemFactory factory = new DiskFileItemFactory(); 
      ServletFileUpload upload = new ServletFileUpload(factory); 

      boolean gotPath = false; 

      String message = ""; 
      String media_category = ""; 

      StringBuilder sb = new StringBuilder(); 
      sb.append(Shared.getTimeStamp() + ": Uploading med files to category - "); 

      try { 
       FileItemIterator it = upload.getItemIterator(request); 

       while (it.hasNext()) { 
        FileItemStream item = it.next(); 

        //message += item.getFieldName() + ": "; 

        if (item.isFormField()) { 
         if (item.getFieldName().equals("MediaCategory")) { 
          media_category = Streams.asString(item.openStream()); 
          path += media_category; 

          gotPath = true; 

          message += path + System.lineSeparator(); 

         } else if (item.getFieldName().equals("UserName")) { 

          user += Streams.asString(item.openStream()); 

         } 
        } else { 
         if (gotPath) { 
          String fileout = path + "/" + item.getName(); 

          message += fileout + System.lineSeparator(); 

          InputStream input = null; 
          OutputStream output = null; 

          try { 
           output = new FileOutputStream(new File(fileout)); 

           input = item.openStream(); 

           byte[] buffer = new byte[256]; 
           int count; 

           while ((count = input.read(buffer)) > 0) { 
            output.write(buffer, 0, count); 
           } 

          } finally { 
           input.close(); 
           output.close(); 
          } 
         } 
        } 
       } 
      } catch (Exception e) { 
       response.sendRedirect("Error on item: " + e.getLocalizedMessage()); 
      } 

      response.setStatus(HttpServletResponse.SC_CREATED); 

      //response.getWriter().print(message); 

      sb.append(message + System.lineSeparator()); 
      Shared.writeUserLog(user, sb.toString()); 

     } else { 
      response.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, 
        "Unsupported media type..."); 
     } 

    } 
} 

web.xml을 나는 서블릿 설정이 작동 알고 있지만 실제로 차이를 만들 경우 여전히 상황에 맞는 PARAMS에 대해 확실 해요합니다.