在 Spring Boot 中使用 Jersey 进行文件上传,收到 400 Bad Request

Using Jersey in Spring Boot for file upload getting 400 Bad Request

我已经尝试了很多用球衣上传文件的例子。我可以使用 @RequestMapping、ResponseEntity 而不是 @Path 等使其与纯 Spring 一起工作。但我想使用球衣,因为我的所有其他端点都由球衣处理。

更新:我觉得我无法传递表单数据、文件或文本。即使是 @FormDataParam("directory") String directory 的单个 FormDataParam 也会给出错误的请求

我有以下class

@Component
@Path("/v1.0")
public class FileOperationsResource  {

    private ConfigurationReader mConfigReader;

    @Autowired
    public FileOperationsResource(ConfigurationReader configurationReader) {
        mConfigReader = configurationReader;
    }

   @POST
   @Path("/file/upload")
   @Consumes(MediaType.MULTIPART_FORM_DATA)
   public Response uploadFile(@QueryParam("dir") String directory,
                              @FormDataParam("file") InputStream file,
                              @FormDataParam("file") FormDataContentDisposition fileDisposition) {

我已将以下行添加到我的 ResourceConfig

register(MultiPartFeature.class);

我已经添加了以下maven依赖,但是没有添加版本,因为我的理解是它会自动拉取与我的spring版本兼容的版本,我发现新版本不再由于缺少 MultiPartFeature,请允许我在 ResourceConfig 中添加寄存器。

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-multipart</artifactId>
</dependency>

当我进行以下调用时,收到 400 Bad Request。我觉得我一定是打错了电话,或者没有连接其他东西。任何帮助将不胜感激。

回复:

{
    "timestamp": "2018-04-20T15:51:01.790+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "Bad Request",
    "path": "/api/v1.0/file/upload"
}

我已经通过 Postman 和表单进行了调用,并通过以下调用进行了 curl

curl --verbose --form file=@"settings.xml" http://localhost:8080/api/v1.0/file/upload?dir=MyDir

您在 application.properties 中设置的 spring.jersey.type 是什么?我有使用 Jersey 和 Boot 的文件上传,我相信这就是你需要的:

# JERSEY
spring.jersey.type=servlet
spring.jersey.servlet.load-on-startup=1

出于示例目的,这是我的端点:

@POST
@Path("/file/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(@FormDataParam("file") InputStream fileInputStream,
                           @FormDataParam("file") FormDataContentDisposition fileDisposition) {

    String fileName = fileDisposition.getFileName();
    StringBuilder fileContents = new StringBuilder();
    int read = 0;
    int totalBytesRead = 0;
    byte[] bytes = new byte[1024];
    try {
        while ((read = fileInputStream.read(bytes)) != -1) {
            ...save file...
        }
    } catch (IOException e) {
        mLogger.error(e.getMessage(), e);
    }

    return Response.ok().build();
}