【问题标题】:Upload binary file with RESTful web service in Glassfish在 Glassfish 中使用 RESTful Web 服务上传二进制文件
【发布时间】:2013-05-26 14:34:31
【问题描述】:

我正在尝试将二进制文件(图片)发送到在 Glassfish 中运行的 RESTful Web 服务。 我找到了应该这样做的代码 Upload data method in REST web service 和其他几个类似的帖子,但都不起作用。 这是我的代码:

@POST
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
public String post( InputStream payload ) throws IOException
{
    return "Payload size="+payload.available();
}

@POST
@Path("bytes")
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
public String post( byte[] payload )
{
    return "Payload size="+payload.length;
}

接收InputStream的方法返回:

Payload size=0

接收byte[]的方法返回:

Error 500 - Internal Server Error

错误 500 是由这个异常引起的:

Caused by: java.lang.NullPointerException
at com.sun.jersey.moxy.MoxyMessageBodyWorker.typeIsKnown(MoxyMessageBodyWorker.java:110)
at com.sun.jersey.moxy.MoxyMessageBodyWorker.isReadable(MoxyMessageBodyWorker.java:133)
at com.sun.jersey.core.spi.factory.MessageBodyFactory._getMessageBodyReader(MessageBodyFactory.java:345)
at com.sun.jersey.core.spi.factory.MessageBodyFactory._getMessageBodyReader(MessageBodyFactory.java:315)
at com.sun.jersey.core.spi.factory.MessageBodyFactory.getMessageBodyReader(MessageBodyFactory.java:294)
at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:449)
at com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123)
at com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46)
... 40 more

非常感谢任何建议。

【问题讨论】:

  • 我强烈建议您删除其中一个标签,以便为“java”腾出空间
  • @MrD 好主意。完毕。谢谢。

标签: java web-services rest file-upload jersey


【解决方案1】:

我认为 APPLICATION_OCTET_STREAM 可以工作,但是 payload.available() 在这里不能工作

@POST
@Path("upload")
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
public String uploadStream( InputStream payload ) throws IOException
{
    while(true) {
        try {
             DataInputStream dis = new DataInputStream(payload);
            System.out.println(dis.readByte());
        } catch (Exception e) {
            break;
        }
    }
    //Or you can save the inputsream to a file directly, use the code, but must remove the while() above.
  /**
    OutputStream os =new FileOutputStream("C:\recieved.jpg");
    IOUtils.copy(payload,os);
  **/
    System.out.println("Payload size="+payload.available());
    return "Payload size="+payload.available();
}

您会发现该方法确实有效,因为它会打印一些字节。但是 payload.available() 是 0。

【讨论】:

  • 谢谢斯托尼。我以前看过这个例子,但问题是客户端没有发送 MediaType.MULTIPART_FORM_DATA - 它正在发送 MediaType.APPLICATION_OCTET_STREAM,所以这个例子对我不起作用。有没有办法改变它来消耗八位字节流?
  • 我认为 APPLICATION_OCTET_STREAM 可以工作,但是 payload.available() 不能在这里工作。我只是编辑我的答案,请检查它。
猜你喜欢
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 2021-05-31
相关资源
最近更新 更多