RESTlet:如何处理multipart / form-data请求?

当它是多部分/表单数据请求时,如何捕获传入的@Post变量?

对于常规的Post请求,我会这样做:

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

但因为它是一个multipart / form-data请求,所以上面的输出为null

我是一个Java新手所以要温柔:)

PS:我对处理传入的文件,只对文本字段感兴趣。

这是我的一个方法(Restlet 2.0)的粘贴。 这里我有一个包含一个文件上传和其他字段的表单,因此它相当完整:

 @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 items; try { // 3/ Request is parsed by the handler which generates a list of FileItems items = upload.parseRequest(getRequest()); Map props = new HashMap(); File file = null; String filename = null; for (final Iterator 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; } 

我最终会将它重构为更通用的东西,但这就是我现在拥有的东西。

将它打包在一行,在你的Restlet资源类中:

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

然后在您的项目循环中,您可以使用以下方法测试它们是否是fileItems:isFormField()。

测试fileItem是否是一个formField … make sens? ;)
但它的确有效。

祝你好运。

要回答我自己的问题,目前在版本1.2中这是不可行的