Yon*_*tan 7 java google-app-engine file-upload resteasy
我正在尝试使用resteasy 2.0.1.GA将带有文件的表单上传到GAE应用程序中,使用我如何使用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>
Run Code Online (Sandbox Code Playgroud)
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";
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误消息(可能是由于RESTEasy Provider的implmenetation使用临时文件来处理输入流):
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)
...
Run Code Online (Sandbox Code Playgroud)
是否有人遇到过GAE和RESTEasy这个问题?有人解决了吗?在任何地方我找不到任何关于这个问题的提及.谢谢!
我刚遇到这个问题并查看了mime4j的Message构造函数的源代码.它得到TempFileStorageProvider调用DefaultStorageProvider.getInstance().您可以通过调用以下命令将默认值更改为不写入文件系统的默认值:
DefaultStorageProvider.setInstance(new MemoryStorageProvider());
Run Code Online (Sandbox Code Playgroud)
那是org.apache.james.mime4j.storage.DefaultStorageProvider.
感谢使用@MultipartForm的简洁示例!
好吧,我找到了它的随处 - 我正在使用apache commons-upload with RESTEasy,通过将HttpServletRequest注入RESTEasy方法(并使用commons-IO将流转换为字节数组/字符串).所有包都支持应用引擎.
@Path("")
public class Rest {
@POST
@Path("/rest/upload")
public String postContent(@Context HttpServletRequest request) {
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator fileIterator = upload.getItemIterator(request);
while (fileIterator.hasNext()) {
FileItemStream item = fileIterator.next();
if ("file".equals(item.getFieldName())){
byte[] content = IOUtils.toByteArray(item.openStream())
// Save content into datastore
// ...
} else if ("name".equals(item.getFieldName())){
String name=IOUtils.toString(item.openStream());
// Do something with the name string
// ...
}
}
return "Done";
}
}
Run Code Online (Sandbox Code Playgroud)
我仍然宁愿找到一个RESTEasy解决方案,以避免围绕fileIterator编译代码.
| 归档时间: |
|
| 查看次数: |
10438 次 |
| 最近记录: |