我需要使用 restlet* 上传 带有其他数据 的文件 。因此,我创建了一个示例html页面,如下所示。 *
<html> <body> <h1>*****Upload File with RESTFul WebService*****</h1> <form action="http://localhost:8080/test/api/streams/sample.json" method="post" enctype="multipart/form-data"> <fieldset> <legend>Upload File</legend> <input type="file" name="fileToUpload"/><br /> <br /><br /> Party ID<input type="text" name="mybody" /><br /> <input type="submit" name="Upload" id="Upload" value="Upload" /> </fieldset> </form> </body>
我需要从 输入字段中 读取值以及文件数据。现在可以读取文件内容。如何在同一api调用中从该输入框中获取值。
@Post public Representation accept(Representation entity) throws Exception { Representation result = 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 based on the Restlet // FileUpload extension that will parse Restlet requests and // generates FileItems. RestletFileUpload upload = new RestletFileUpload(factory); // 3/ Request is parsed by the handler which generates a // list of FileItems FileItemIterator fileIterator = upload.getItemIterator(entity); // Process only the uploaded item called "fileToUpload" // and return back boolean found = false; while (fileIterator.hasNext() && !found) { FileItemStream fi = fileIterator.next(); Extractor extractor = new Extractor(getContext()); if (fi.getFieldName().equals("fileToUpload")) { found = true; // consume the stream immediately, otherwise the stream // will be closed. StringBuilder sb = new StringBuilder("media type: "); sb.append(fi.getContentType()).append("\n"); sb.append("file name : "); sb.append(fi.getName()).append("\n"); BufferedReader br = new BufferedReader(new InputStreamReader(fi.openStream())); String line = null; while ((line = br.readLine()) != null) { sb.append(line); } sb.append("\n"); result = new StringRepresentation(sb.toString(), MediaType.TEXT_PLAIN); } } } else { setStatus(Status.CLIENT_ERROR_BAD_REQUEST); } System.out.println("result==" + result); } return result;
}
首先,您需要了解请求的内容。如果您查看发送的请求(萤火虫或其他),您将看到以下内容:
-----------------------------2003194375274723921294130757 Content-Disposition: form-data; name="fileToUpload"; filename="mysql.sql" Content-Type: application/sql <<YOUR FILE CONTENT>> -----------------------------2003194375274723921294130757 Content-Disposition: form-data; name="mybody" my value -----------------------------2003194375274723921294130757 Content-Disposition: form-data; name="Upload" Upload -----------------------------2003194375274723921294130757--
如您所见,请求中包含多个部分。这意味着您可以遍历服务器资源中的这些部分。在您提供的代码中,您仅查找具有名称的条目,fileToUpload找到该条目后,您将中断循环。
fileToUpload
您可以更新代码以完成完整循环并检查mybody输入字段的值,如下所述:
mybody
while (fileIterator.hasNext()) { FileItemStream fi = fileIterator.next(); if ("mybody".equals(fi.getFieldName())) { BufferedReader br = new BufferedReader( new InputStreamReader(fi.openStream())); String fieldValue = null; if ((line = br.readLine()) != null) { fieldValue = line; } } else if ("fileToUpload".equals(fi.getFieldName())) { (...) } (...) }
希望能有所帮助,蒂埃里