Jersey FormDataParam失败,出现400错误请求



当我试图将图像上传到我的服务时,Jersey和FormDataParam有一个非常奇怪的行为。我的服务在Dropwizard上运行。

接受图像(以及元数据对象(的方法如下所示:

@POST
@Path("/photos")
@Consumes("multipart/form-data")
fun upload(
@FormDataParam("photo") fileInputStream: FileInputStream,
@FormDataParam("metadata") metadata: PhotoMetadataV1RequestModel
) {
// do something
}

我已经在Guice模块中注册了MultipartFeature

public class JerseyModule extends AbstractModule {
@Override
protected void configure() {
// other stuff
bind(MultiPartFeature.class).in(Scopes.SINGLETON);
}
}

我在build.gradle中添加了一个jersey-multipart依赖项。

// Jersey
compile "org.glassfish.jersey.core:jersey-server:$jerseyVersion"
compile "org.glassfish.jersey.media:jersey-media-multipart:$jerseyVersion"

现在是有趣的部分。

如果我尝试使用绝对路径上传文件,这实际上是有效的!但是,它不起作用,我尝试使用相对路径上传文件。

更重要的是,当服务部署在另一台机器上时,它也不起作用(与上传图像请求不同(。这很重要,因为我将我的服务部署到Heroku,并且我需要从其他地方上传图像!

这就是工作原理(photo的绝对路径(:

curl --location --request POST "http://localhost:8095/rest/v1/self/photos" 
--header "Authorization: Bearer GaKC8xQju5h" 
--form 'photo=/Users/whizzil/Desktop/nova_scripts/create_users/user-lina/photos-webp/photo-profile-1.webp' 
--form 'metadata={"photoType": "PROFILE", "position": 2};type=application/json' 

然而,如果服务器的url不是localhost,而是例如Heroku服务器,则即使这样也不起作用。

这是不起作用的(photo的相对路径(:

curl --location --request POST "http://localhost:8095/rest/v1/self/photos" 
--header "Authorization: Bearer GaKC8xQju5h" 
--form 'photo=@./photo-profile-1.webp' 
--form 'metadata={"photoType": "PROFILE", "position": 2};type=application/json'

当它不起作用时抛出的异常:

org.glassfish.jersey.internal.inject.ExtractorException: org.glassfish.jersey.internal.inject.ExtractorException: java.io.FileNotFoundException: Invalid file path
org.glassfish.jersey.media.multipart.FormDataParamException: HTTP 400 Bad Request
at org.glassfish.jersey.media.multipart.internal.FormDataParamValueFactoryProvider$FormDataParamValueFactory.provide(FormDataParamValueFactoryProvider.java:352)
at org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.provide(ParamValueFactoryWithSource.java:71)
at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:90)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:127)

我在这里迷路了。我试着在谷歌上搜索所有内容,但没有成功。非常感谢您的帮助!

FileInputStream更改为InputStream解决了此问题。不过我不知道为什么。

最新更新