问题
I need to upload a file with some additional data using restlet. So i create a sample html page like below.
<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>
I need to read the value from input field along with the file data.Now it is possible to read the file content.how can i get value from that input box in the same api call.
@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;
}
回答1:
First you need to understand the content of your request. If you have a look at the sent request (firebug or something else), you'll see the following content:
-----------------------------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--
As you can see there are several parts in your request. This means that you can iterate over these parts in your server resource. In the code you provide, you only look for the entry with name fileToUpload
and when found, you break the loop.
You can update your code to do the complete loop and check the value mybody
for your input field, as described below:
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())) {
(...)
}
(...)
}
Hope it helps, Thierry
来源:https://stackoverflow.com/questions/28292523/file-upload-with-description-in-restlet