Jersey FormDataParam 失败,出现 400 Bad Request

Jersey FormDataParam fails with 400 Bad Request

在尝试将图像上传到我的服务时,我从 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 不是本地主机,那么即使这样也不起作用,例如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 解决了问题。不过我不知道为什么。