2017-10-03 4 views
1

Ich habe ein Formular mit FormPanel und drei FileUpload Objekte gebaut. Die drei Objekte FileUpload verweisen auf unterschiedliche Arten von Binärdateien. Ich habe ziemlich viel getestet, und die Dateien wurden immer in der Reihenfolge in der Liste platziert, die ich ihnen (von oben nach unten) in den drei FileUpload Objekte hinzugefügt habe. So zum Beispiel in der Form unterhalb der Dateien 1, 2 und 3 auf dem Server in dieser Reihenfolge ankommen (ich lief es mit verschiedenen Dateien haben 20 oder 30 mal):Werden in GWT Multipart-Formulardaten garantiert in der Reihenfolge gesendet, in der sie sich im Formular befinden?

file upload example

Ist das garantiert? oder sollte ich einen Weg finden, sie irgendwie zu beschriften?

+1

Nicht sicher über die Reihenfolge, aber Sie können die Feldnamen überprüfen, während Sie mit FileItemIterator durch sie iterieren, damit Sie wissen, um welche es geht. Sie können auch festlegen, dass die Dateiauswahl mehrere Dateien statt einer pro Widget auswählt. Obwohl ich dies das letzte Mal gesagt habe, hatte ich Felder versteckt, die vor dem Datei-Widget geparst haben. – WLGfx

+0

Also das obige Beispiel verwendet den Feldnamen wird mir "Datei 1" etc .. wenn ich die 'FileUpload' auf diese Weise beschriften? Ich werde die Namen der Dateien nicht im Voraus wissen, und sie sind alle vom selben Typ. –

+1

Ja, das ist richtig. getFieldName() gibt den Feldnamen zurück und getName() gibt den Dateinamen des Uploads zurück. – WLGfx

Antwort

1

Wenn Sie den FileItemIterator verwenden, können Sie jedes Element im Formular überprüfen. Soweit mir bekannt ist, kommen sie in Ordnung, sie sind im HTML.

Der Iterator wird Sie wissen lassen, ob es ein Formularfeld oder eine Upload-Datei ist, wie in einer alten Funktion, die ich geschrieben habe.

Bei der Verarbeitung eines Dateiuploads verwenden Sie getFieldName(), um das Formularfeld zu identifizieren, und getName(), um den Dateinamen vom Client zu verarbeiten.

Die Schwierigkeit besteht in der Zuweisung des Servlets in den Parametern in der Datei web.xml.

Hoffentlich wird der folgende Code Ihnen helfen, es herauszufinden.

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

<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> 

Ich weiß, die Servlet-Einstellungen arbeiten, aber ich bin immer noch unsicher über den Zusammenhang params und wenn sie tatsächlich einen Unterschied machen.

Verwandte Themen