Hello,
I've made some tests, and I think I will change the documentation, as we
can have the same code in classic JVM, or GAE/servlet contexts:
In this sample code, we just send back the content of the fileToUpload
item.
@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
// an return back
boolean found = false;
while (fileIterator.hasNext() !found) {
FileItemStream fi = fileIterator.next();
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 {
// POST request with no entity.
setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
}
}
return result;
}
Having said that, I think I will change the implementation of the
RestletFileUpload#parseRequest method in order to rely on the underlying
servlet, and remove the RestletFileUpload#parseRepresentation method.
Thanks a lot.
2015-01-16 11:41 GMT+01:00 Xybrek xyb...@gmail.com:
On Friday, 16 January, 2015 05:51 PM, Thierry Boileau wrote:
Hello,
I guess you are refering to this page of the user guide:
http://restlet.com/technical-resources/restlet-framework/guide/2.3/extensions/fileupload
The code is exactly the same for the GAE edition, except that you cannot
write File directly as is it forbidden by the GAE platform.
You can still have access to the FileItem#getInputStream() method.
Best regards,
Thierry Boileau
--
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447dsMessageId=3094350
Theierry,
I am not sure but it seems the sample you gave throws error and we
cannot use the repackaged apache package with Restlet.
So I improvised, I manage to upload large files with Restlet and GAE
with this code:
@Override
public void upload(Representation entity) throws Exception {
if (entity != null) {
if
(MediaType.MULTIPART_FORM_DATA.equals(entity.getMediaType(), true)) {
Request restletRequest = getRequest();
HttpServletRequest servletRequest =
ServletUtils.getRequest(restletRequest);
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator fileIterator =
upload.getItemIterator(servletRequest);
while (fileIterator.hasNext()) {
FileItemStream item = fileIterator.next();
String name = item.getName();
byte[] content =
ByteStreams.toByteArray(item.openStream());
// do stuff with content
}
} else {
setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
}
} else {
setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
}
}
Perhaps you can share this with Restlet documentation so community would
benefit to this code. Or perhaps you can see some issues with the code.
--