2009-06-15 11 views
3

Wie fangen Sie @ Post-Variablen ab, wenn es sich um eine Multipart-/Formulardatenanforderung handelt?RESTlet: Wie werden Multipart/Formulardaten Anfragen bearbeitet?

Für eine regelmäßige Gesuch ich tun würde:

@Post 
public void postExample(Representation entity) throws Exception{ 
    Form form = new Form(entity); 
    System.out.println(form.getFirstValue("something")); 
} 

Aber weil es sich um eine multipart/form Daten anfordern die oben Ausgänge null

Ich bin ein Java-Neuling so sanft sein :)

PS: Ich bin nicht daran interessiert, die eingehenden Dateien, nur die Textfelder zu verarbeiten.

+0

Können Sie die Formulardaten als HTML hinzufügen? – Clint

Antwort

0

Um meine eigene Frage zu beantworten, das in der Version 1.2

1

derzeit nicht möglich ist, es in einer Zeile zu packen, in Ihnen Restlet Ressourcenklasse:

Iterator it = neue RestletFileUpload (neu DiskFileItemFactory()) .parseRequest (getRequest()). iterator();

Dann können Sie in Ihrer Schleife durch Ihre Elemente, ob sie sind oder nicht fileItems mit der Methode: isFormField().

Testen, ob ein fileItem ein formField ist ... macht sens? ;)
aber es funktioniert.

Viel Glück.

7

Dies ist eine Paste aus einer meiner Methoden (Restlet 2.0). Hier habe ich eine Form, die eine Datei-Upload plus andere Felder enthält, daher ist es ziemlich vollständig:

@Post 
public Representation createTransaction(Representation entity) { 
    Representation rep = null; 
    if (entity != null) { 
     if (MediaType.MULTIPART_FORM_DATA.equals(entity.getMediaType(), true)) { 
      // 1/ Create a factory for disk-based file items 
      DiskFileItemFactory factory = new DiskFileItemFactory(); 
      factory.setSizeThreshold(1000240); 

      // 2/ Create a new file upload handler 
      RestletFileUpload upload = new RestletFileUpload(factory); 
      List<FileItem> items; 
      try { 
       // 3/ Request is parsed by the handler which generates a list of FileItems 
       items = upload.parseRequest(getRequest()); 

       Map<String, String> props = new HashMap<String, String>(); 
       File file = null; 
       String filename = null; 

       for (final Iterator<FileItem> it = items.iterator(); it.hasNext();) { 
        FileItem fi = it.next(); 
        String name = fi.getName(); 
        if (name == null) { 
         props.put(fi.getFieldName(), new String(fi.get(), "UTF-8")); 
        } else { 
         String tempDir = System.getProperty("java.io.tmpdir"); 
         file = new File(tempDir + File.separator + "file.txt"); 
         filename = name; 
         fi.getInputStream(); 
         fi.write(file); 
        } 
       } 

       // [...] my processing code 

       String redirectUrl = ...; // address of newly created resource 
       getResponse().redirectSeeOther(redirectUrl); 
      } catch (Exception e) { 
       // The message of all thrown exception is sent back to 
       // client as simple plain text 
       getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST); 
       e.printStackTrace(); 
       rep = new StringRepresentation(e.getMessage(), MediaType.TEXT_PLAIN); 
      } 
     } else { 
      // other format != multipart form data 
      getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST); 
      rep = new StringRepresentation("Multipart/form-data required", MediaType.TEXT_PLAIN); 
     } 
    } else { 
     // POST request with no entity. 
     getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST); 
     rep = new StringRepresentation("Error", MediaType.TEXT_PLAIN); 
    } 

    return rep; 
} 

ich es Refactoring am Ende dann zu etwas mehr generisch, aber das ist, was ich jetzt habe.

+0

aber brauchen Sie keine Annotation für die Post-Anfrage, wie @Post ("Formular") oder etwas? Ich bekomme eine 405 für etwas sehr ähnliches zurück – adhanlon

+0

Ich habe eine @ Post-Annotation (aber ohne Parameter). Der Parameter begrenzt die Darstellungen, die Sie akzeptieren (http://www.restlet.org/documentation/2.0/jse/api/org/restlet/resource/Post.html). Die HTTP 405 Methode ist nicht erlaubt (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) - Restlet erkennt Ihre Ressource möglicherweise nicht als 'postierbar', wenn keine @ Post Annotation vorhanden ist. –

+1

Ich hatte es nur @Post, und es wurde weiterhin eine 405 zurückgegeben. Dann habe ich Folgendes hinzugefügt: getMetadataService(). AddExtension ("multipart", MediaType.MULTIPART_FORM_DATA, true); an den Ressourcenkonstruktor und änderte meine Annotation von @Post zu @Post ("multipart") und es funktionierte dann. – adhanlon