Grails JAX-RS REST 多部分文件上传
Posted
技术标签:
【中文标题】Grails JAX-RS REST 多部分文件上传【英文标题】:Grails JAX-RS REST multipart file upload 【发布时间】:2019-08-26 03:22:35 【问题描述】:尝试让多部分文件上传以在 Grails 2.5.4 资源中工作。
我真的很想使用 Spring 开箱即用的多部分功能,但我找不到适合我特定情况的示例。
我正在从 Postman 调用 API。带有form-data
的正文和一个附加在file
字段中的PDF 文件。没有其他标题!
第一次尝试
@POST
@Path("/pdf")
Response createPdf(MultipartFile file)
在 Postman 中返回 415 Unsuported Media Type
,并在服务器上返回:
[...] ERROR container.ContainerRequest - A message body reader for Java class org.springframework.web.multipart.MultipartHttpServletRequest [...]
The registered message body readers compatible with the MIME media type are:
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
com.sun.jersey.core.impl.provider.entity.EntityHolderReader
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General
添加@Consumes(MediaType.MULTIPART_FORM_DATA)
没有帮助。
我尝试了其他参数,例如MultipartHttpServletRequest
,但仍然没有消息正文阅读器。
第二次尝试
@POST
@Path("/pdf")
@Consumes(MediaType.MULTIPART_FORM_DATA)
Response createPdf(@FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileDetail)
返回 500 错误,并在服务器上:
SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.carfax.VehicleReceiptPhotoResource.createPdf(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) at parameter at index 0
SEVERE: Missing dependency for method public javax.ws.rs.core.Response createPdf(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) at parameter at index 1
SEVERE: Method, public javax.ws.rs.core.Response createPdf(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition), annotated with POST of resource, class com.carfax.VehicleReceiptPhotoResource, is not recognized as valid resource method.
拥有这些依赖项
compile group: 'com.sun.jersey', name: 'jersey-bundle', version: '1.19.4'
compile group: 'com.sun.jersey', name: 'jersey-json', version: '1.19.4'
compile "javax.ws.rs:javax.ws.rs-api:2.1@jar"
compile ('org.glassfish.jersey.media:jersey-media-multipart:2.27')
exclude group:'javax.ws.rs'
compile group: 'org.jvnet.mimepull', name: 'mimepull', version: '1.9.11'
第三次尝试
@POST
@Path("/pdf")
Response createPdf(@FormDataParam("file") InputStream fileInputStream)
使用与第二次尝试相同的球衣依赖关系,这可行,但对我来说还不够好。我想一次上传多个文件,并在旁边获取一些额外的 json 信息。
我想要什么
关于 Grails 中有多少种多文件上传方法的一些说明 有哪些不同的库可以实现这一目标 在 Grails REST 资源中执行此操作,而不是在控制器中我浏览的一些链接
Jersey Exception : SEVERE: A message body reader for Java class https://groups.google.com/forum/#!topic/dropwizard-user/moYQOtxXnRU Maven jersey-multipart missing dependency for javax.ws.rs.core.Response https://philsturgeon.uk/api/2016/01/04/http-rest-api-file-uploads/ https://www.javatpoint.com/jax-rs-file-upload-example JAX-RS Multipart with com.sun.jersey【问题讨论】:
您正在尝试将 Jersey 2.x 多部分支持与 Jersey 1.x 应用程序混合使用。这是行不通的。您需要使用the 1.x multipart。摆脱 2.x 版本。 @PaulSamsotha Huh.. 使用 Jersey 1.x 和FormDataMultiPart
作为参数就像一个魅力。您如何推断它是 Jersey 1.x 应用程序,我如何升级到 2.x?更好的是,相比之下,2.x 的 mutlipart 看起来如何?
【参考方案1】:
*根据Paul Samsotha的评论
You're trying to mix Jersey 2.x multipart support with a Jersey 1.x application. This isn't going to work. You need to use the 1.x multipart. Get rid of the 2.x one.
【讨论】:
以上是关于Grails JAX-RS REST 多部分文件上传的主要内容,如果未能解决你的问题,请参考以下文章
对于 Java 中的 RESTful 服务,JAX-RS 是不是比 Swing、Grails 或 Play 等 MVC 框架更好?
使用 Spring Security Rest 插件保护 Grails Rest Api