2009-06-15 18 views
3

multipart/form-dataリクエストの場合、着信@Post変数をどのようにキャッチしますか?私はどうしたら通常のPOSTリクエストの場合RESTlet:multipart/form-dataリクエストを処理する方法は?

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

しかし、それはマルチパート/フォームデータは、上記の出力を要求ヌル

あるので、私は、Java初心者ですので優しくして:)

PS:入力ファイルの処理に興味はありませんが、テキストフィールドのみです。自分の質問に答えるために

+0

フォームデータをhtmlとして追加できますか? – Clint

答えて

0

、これはあなたのRestletリソースクラスでは、1行にそれをパックするバージョンでは、現在1.2

1

現実的ではありません。

イテレータそれは新しいRestletFileUpload(新しいDiskFileItemFactoryを())= .parseRequest(getRequest())。iterator(); isFormField():

は、その後、あなたのアイテムを通して、あなたのループでは、あなたは彼らが法とfileItemsていないかどうかをテストすることができます。

fileItemがformFieldであるかどうかをテストしています... sensですか? ;)
でも動作します。

幸運。

7

これは私の方法(Restlet 2.0)の1つからのペーストです。

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

私はより一般的な何かにそれをリファクタリング終わるだろうが、これは私が今まで持っているものである:ここで私は、したがって、それはかなり完了し、一つのファイルのアップロードに加えて他のフィールドを含んでフォームを持っています。

+0

@Post( "form")なんかのような投稿要求のためのアノテーションは必要ありませんか?非常に似たようなことをすると405が返されます。 – adhanlon

+0

私は@Postアノテーションを持っていますが(パラメータはありません)。パラメータは、受け入れた表現を制限します(http://www.restlet.org/documentation/2.0/jse/api/org/restlet/resource/Post.html)。 HTTP 405はメソッドが許可されていません(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) - @Postアノテーションが存在しない場合、Restletはあなたのリソースを 'ポストテーブル'として認識しません。 –

+1

私はちょうど@Postとして持っていましたが、それは405を返し続けました。次に、これを追加しました:getMetadataService()。addExtension( "multipart"、MediaType.MULTIPART_FORM_DATA、true);リソースのコンストラクタに渡し、@Postから@Post( "multipart")へのアノテーションを変更しました。 – adhanlon

関連する問題