在 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();
}
我已经尝试了很多用球衣上传文件的例子。我可以使用 @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();
}