GAE上的Resteasy multipart /数据格式文件上传 [英] Resteasy multipart/data-form file upload on GAE

查看:240
本文介绍了GAE上的Resteasy multipart /数据格式文件上传的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图用resteasy 2.0.1.GA上传一个带有文件的表单到GAE应用程序中,使用如何做一个多部分/形式文件上传与jax-rs?



Index.html

 < form action =/ rest / uploadmethod =postenctype =multipart / form-data> 
< input type =textname =name/>
< input type =filename =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());
返回完成;




UploadForm.java / p>

  public class UploadForm {

private String name;
私人字节[]数据;
$ b @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;






$ b

但是我收到以下错误信息由于RESTEasy提供者使用临时文件来处理输入流):

  HTTP错误500 

访问/文件/服务/上传时出现问题。原因:

java.io.FileOutputStream是一个受限制的类。有关更多详细信息,请参阅Google App Engine开发人员指南。

导致:

java.lang.NoClassDefFoundError:java.io.FileOutputStream是一个受限制的类。有关更多详细信息,请参阅Google App Engine开发人员指南。在com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)

。在org.apache.james.mime4j.storage.TempFileStorageProvider $ TempFileStorageOutputStream<。 INIT>(TempFileStorageProvider.java:117)
。在org.apache.james.mime4j.storage.TempFileStorageProvider.createStorageOutputStream(TempFileStorageProvider.java:107)
。在org.apache.james.mime4j.storage.ThresholdStorageProvider $ ThresholdStorageOutputStream.write0(ThresholdStorageProvider.java:113)
在org.apache.james.mime4j.storage.StorageOutputStream.write(StorageOutputStream.java:119)
在org.apache.james.mime4j.codec .CodecUtil.copy(CodecUtil.java:43)
在org.apache.james.mime4j.storage.AbstractStorageProvider.store(AbstractStorageProvider.java:57)
在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.mime 4j.parser.MimeStreamParser.parse(MimeStreamParser.java:101)
at org.apache.james.mime4j.message.Message。< init>(Message.java:141)
at org.apache .james.mime4j.message.Message<初始化>(Message.java:100)
。在org.jboss.resteasy.plugins.providers.multipart.MultipartInputImpl.parse(MultipartInputImpl.java:76)
。在org.jboss.resteasy.plugins.providers.multipart.MultipartFormAnnotationReader.readFrom(MultipartFormAnnotationReader.java:55)
在org.jboss.resteasy.core.interception.MessageBodyReaderContextImpl.proceed(MessageBodyReaderContextImpl.java:105)$在org.jboss.resteasy.plugins.interceptors.encoding.GZIPDecodingInterceptor.read(GZIPDecodingInterceptor.java:46)b $ b。在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.ReaderUtili ty.doRead(ReaderUtility.java:93)
在org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:146)
在org.jboss.resteasy.core.MethodInjectorImpl.injectArguments( MethodInjectorImpl.java:114)在org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:137

在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)$ b在org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:514)
$ b在org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:491)
。在组织.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:120)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatc her.java:200)在org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service
(HttpServletDispatcher.java:48)
。在org.jboss.resteasy.plugins.server.servlet。在javax.servlet.http.HttpServlet.service HttpServletDispatcher.service(HttpServletDispatcher.java:43)
(HttpServlet.java:717)
...

有没有人用GAE和RESTEasy遇到过这个问题?有没有人解决它?我找不到任何地方提到这个问题。
Thanks!

解决方案

那么,我已经找到了一个步行 - 我使用Apache公共通过将HttpServletRequest注入RESTEasy方法(并使用commons-IO将流转换为字节数组/字符串),使用RESTEasy进行上载。所有软件包都支持app引擎。

  @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())
//将内容保存到数据存储区
// ...
} else if(name.equals(item.getFieldName())){
String name = IOUtils.toString(item.openStream());
//使用名称字符串
// ...
}
}
做一些事情返回完成;


$ / code $ / pre

我宁愿找一个RESTEasy解决方案来避免fileIterator周围的简化代码。


I'm trying to use resteasy 2.0.1.GA to upload a form with a file in it into GAE application, using the method advised at How do I do a multipart/form file upload with 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;
    }
}

But I'm getting the following error message (probably due to the RESTEasy Provider's implmenetation that uses temporary files to handle the input stream):

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)
    ...

Has anyone encountered this issue with GAE and RESTEasy? Has anyone solved it? I couldn't find any mentioning for this issue anywhere. Thanks!

解决方案

Well, I've found a walk-around for it - I'm using apache commons-upload with RESTEasy, by injecting the HttpServletRequest into a RESTEasy method (and transforming the streams into byte array/string using commons-IO). All packages are app engine supported.

@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";
    } 
}

I would still rather find a RESTEasy solution, to avoid the broil-up code around the fileIterator.

这篇关于GAE上的Resteasy multipart /数据格式文件上传的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆