Resteasy multipart/données-forme de téléchargement de fichier sur GAE
Je suis en train d'utiliser resteasy 2.0.1.GA pour télécharger un formulaire avec un fichier en application GAE, à l'aide de la méthode conseillé à Comment dois-je faire un multipart/form upload de fichier avec jax-rs?
Index.html
<form action="/rest/upload" method="post" enctype="multipart/form-data">
<input type="text" name="name" />
<input type="file" name="file" />
<input type="submit" />
</form>
Rest.java
@Path("")
public class Rest {
@POST
@Path("/rest/upload")
@Consumes("multipart/form-data")
public String postContent(@MultipartForm UploadForm form) {
System.out.println(form.getData().length);
System.out.println(form.getName());
return "Done";
}
}
UploadForm.java
public class UploadForm {
private String name;
private byte[] data;
@FormParam("name")
public void setPath(String name) {
this.name = name;
}
public String getName() {
return name;
}
@FormParam("file")
public void setContentData(byte[] data) {
this.data = data;
}
public byte[] getData() {
return data;
}
}
Mais je reçois le message d'erreur suivant (probablement en raison de la RESTEasy Fournisseur de implmenetation qui utilise des fichiers temporaires pour gérer le flux d'entrée):
HTTP ERROR 500
Problem accessing /files/service/upload. Reason:
java.io.FileOutputStream is a restricted class. Please see the Google App Engine developer's guide for more details.
Caused by:
java.lang.NoClassDefFoundError: java.io.FileOutputStream is a restricted class. Please see the Google App Engine developer's guide for more details.
at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)
at org.apache.james.mime4j.storage.TempFileStorageProvider$TempFileStorageOutputStream.<init>(TempFileStorageProvider.java:117)
at org.apache.james.mime4j.storage.TempFileStorageProvider.createStorageOutputStream(TempFileStorageProvider.java:107)
at org.apache.james.mime4j.storage.ThresholdStorageProvider$ThresholdStorageOutputStream.write0(ThresholdStorageProvider.java:113)
at org.apache.james.mime4j.storage.StorageOutputStream.write(StorageOutputStream.java:119)
at org.apache.james.mime4j.codec.CodecUtil.copy(CodecUtil.java:43)
at org.apache.james.mime4j.storage.AbstractStorageProvider.store(AbstractStorageProvider.java:57)
at org.apache.james.mime4j.message.BodyFactory.textBody(BodyFactory.java:167)
at org.apache.james.mime4j.message.MessageBuilder.body(MessageBuilder.java:148)
at org.apache.james.mime4j.parser.MimeStreamParser.parse(MimeStreamParser.java:101)
at org.apache.james.mime4j.message.Message.<init>(Message.java:141)
at org.apache.james.mime4j.message.Message.<init>(Message.java:100)
at org.jboss.resteasy.plugins.providers.multipart.MultipartInputImpl.parse(MultipartInputImpl.java:76)
at org.jboss.resteasy.plugins.providers.multipart.MultipartFormAnnotationReader.readFrom(MultipartFormAnnotationReader.java:55)
at org.jboss.resteasy.core.interception.MessageBodyReaderContextImpl.proceed(MessageBodyReaderContextImpl.java:105)
at org.jboss.resteasy.plugins.interceptors.encoding.GZIPDecodingInterceptor.read(GZIPDecodingInterceptor.java:46)
at org.jboss.resteasy.core.interception.MessageBodyReaderContextImpl.proceed(MessageBodyReaderContextImpl.java:108)
at org.jboss.resteasy.core.messagebody.ReaderUtility.doRead(ReaderUtility.java:111)
at org.jboss.resteasy.core.messagebody.ReaderUtility.doRead(ReaderUtility.java:93)
at org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:146)
at org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:114)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:137)
at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:252)
at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:217)
at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:206)
at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:514)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:491)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:120)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:200)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:48)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:43)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
...
Quelqu'un a rencontré ce problème avec GAE et RESTEasy? Quelqu'un a résolu? Je ne pouvais pas trouver tout de mentionner que cette question n'importe où.
Merci!
OriginalL'auteur Yonatan | 2011-02-02
Vous devez vous connecter pour publier un commentaire.
Je viens de tomber sur ce problème et regardé dans le code source pour mime4j Message du constructeur. Il obtient le
TempFileStorageProvider
en appelantDefaultStorageProvider.getInstance()
. Vous pouvez modifier la valeur par défaut à celui qui n'écrit pas dans le système de fichiers en appelant le:C'est
org.apache.james.mime4j.storage.DefaultStorageProvider
.Merci pour l'concis exemple d'utilisation de @MultipartForm!
OriginalL'auteur stickfigure
Bien, j'ai trouvé une promenade autour pour cela - je suis à l'aide d'apache commons-télécharger avec RESTEasy, par l'injection de la HttpServletRequest dans un RESTEasy méthode (et de transformer les cours d'eau en tableau d'octets/chaîne à l'aide de commons-IO). Tous les colis sont app engine pris en charge.
Je préfère encore trouver un RESTEasy solution, pour éviter la cuisson au gril de code autour de la fileIterator.
OriginalL'auteur Yonatan
Il ressemble à la mime4j de la bibliothèque est en train d'essayer d'écrire les fichiers temporaires, ce qui n'est pas autorisé sur app engine. mime4j peut être configuré pour utiliser une mémoire de stockage de fournisseur, mais je ne sais pas si le RESTeasy utilisation de l'informatique permet à cette configuration.
OriginalL'auteur MattMcKnight
D'utiliser le
MemoryStorageProvider
avec RESTEasy vous pouvez définir la propriété système suivante:Je l'ai essayé avec RESTEasy 2.3.1.GA et jboss-- - - 7.1.0.Final.
Il y avait aussi un bug en avant RESTEasy versions où les fichiers temporaires où elles ne sont pas supprimés (https://issues.jboss.org/browse/RESTEASY-681). À l'aide de la
MemoryStorageProvider
est une solution de contournement pour que.OriginalL'auteur Daniel Engmann
J'ai essayé d'utiliser MemoryStorageProvider. Mais il semble que cela ne fonctionne pas pour la plupart des fichiers autres que les petits.
J'ai trouvé une autre solution qui est d'étendre AbstractStorageProvider à l'aide de google cloud storage et il fonctionne très bien.
https://gist.github.com/azimbabu/0aef75192c385c6d4461118583b6d22f
Je voulais dire que j'ai couru dans le fichier de téléchargement question sur gae et essayé la solution proposée ici : stackoverflow.com/a/10374097/1250435 . Mais cela ne fonctionne pas pour les fichiers plus gros. Donc, je suis venu avec une autre solution et publié de la gist lien avoir ma solution. Je pense que l'essentiel est public.
Vous pouvez ajouter le code de votre réponse directement.
j'ai ajouté le code maintenant
OriginalL'auteur K. M. Fazle Azim Babu
Je viens de mettre resteasy-multipart-fournisseur pot de 2.2.0.GA à 3.1.4.Final .
Nous devons appeler méthode close de manière explicite . Il prendra soin de supprimer m4jxxxx.fichiers tmp.
voir @docs http://docs.jboss.org/resteasy/docs/3.1.4.Final/userguide/html_single/index.html
OriginalL'auteur harpal18