2009-06-15 17 views
3

Comment intercepter les variables @Post entrantes lorsqu'il s'agit d'une requête multipart/form-data?RESTlet: Comment traiter les requêtes multipart/form-data?

Pour une demande régulière après que je ferais:

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

Mais parce qu'il est une donnée-multipart/form demander les sorties au-dessus null

Je suis un débutant Java alors soyez gentil :)

PS: Je ne suis pas intéressé par le traitement des fichiers entrants, juste les champs de texte.

+0

Pouvez-vous ajouter les données de formulaire en tant que html? – Clint

Répondre

0

Pour répondre à ma propre question, ce n'est pas possible actuellement en version 1.2

1

pour emballer sur une ligne, en vous Restlet Catégorie de ressources:

Iterator it = new RestletFileUpload (nouveau DiskFileItemFactory()) .parseRequest (getRequest()). iterator();

Ensuite, dans votre boucle à travers vos éléments, vous pouvez tester s'ils sont ou non des fichiers avec la méthode: isFormField(). Tester si un fichier est un formField ... fait sens? ;)
mais cela fonctionne.

Bonne chance.

7

Ceci est une pâte de l'une de mes méthodes (Restlet 2.0). Ici, j'ai une forme qui comprend un téléchargement de fichiers ainsi que d'autres domaines, il est donc assez complet:

@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; 
} 

Je vais finir par refactoring à quelque chose de plus générique, mais c'est ce que j'ai maintenant.

+0

mais n'avez-vous pas besoin d'une annotation pour la demande Post, comme @Post ("formulaire") ou quelque chose? Je reçois un 405 retourné pour faire quelque chose de très similaire – adhanlon

+0

J'ai une annotation @Post (mais sans paramètres). Le paramètre limite les représentations que vous acceptez (http://www.restlet.org/documentation/2.0/jse/api/org/restlet/resource/Post.html). Le protocole HTTP 405 n'est pas autorisé (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) - Il est possible que Restlet ne reconnaisse pas votre ressource comme "postable" si aucune annotation @Post n'est présente. –

+1

Je l'avais juste comme @Post, et il a continué à retourner un 405. Puis j'ai ajouté ceci: getMetadataService(). AddExtension ("multipart", MediaType.MULTIPART_FORM_DATA, true); au constructeur de ressources, et changé mon annotation de @Post à @Post ("multipart") et cela a ensuite fonctionné. – adhanlon