我正在使用带有弹簧靴的球衣(JAX-RS)和球衣版本2.25.1,我正在尝试发出一个POST请求,我上传了1个文件。
我检查了stackoverflow上的每个链接,几乎所有链接都告诉我注册MultipartFeature并添加init-params。我做了所有更改但仍然遇到同样的错误:
@Component
@ApplicationPath("/secure")
public class JerseyInitialization extends ResourceConfig {
public JerseyInitialization() {
this.register(new JacksonJsonProvider(ObjectMapperFactory.create()));
this.register(MultiPartFeature.class);
this.property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
this.property(ServerProperties.BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true);
this.packages(true, "com.jersey.resources");
}
}
My Post上传图片的请求是:
@Path("/images")
@Consumes(MediaType.APPLICATION_JSON)
@Component
@Transactional
public class ImageResource {
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Image uploadFile(@Valid Image image,
@FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileDetail) throws IOException {
image.setData(IOUtils.toByteArray(uploadedInputStream));
image.setFilename(fileDetail.getFileName());
System.out.println("File uploaded Successfully");
return imageDao.save(image);
}
}
我的应用程序类如下:
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).run(args);
}
@Bean
public ServletRegistrationBean jerseyServlet() {
ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), "/resources");
registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyInitialization.class.getName());
registration.addInitParameter("javax.ws.rs.Application", "com.verico.multipart.app.MultiPartApp");
return registration;
}
}
当我使用以下命令运行curl时:
curl -X POST -H "Authorization: Bearer db4719e2-dd76-4977-9dab-e44670213c63" -F "image=@kreditech.jpg" -F "name=kreditech.jpg" localhost:8080/api/secure/images/upload
我收到如下错误:
"status":415,"error":"Unsupported Media Type","message":"Unsupported Media Type"
答案 0 :(得分:1)
在课前删除@Consumes(MediaType.APPLICATION_JSON)
,并参考下面的代码以获取上传图片。
@Path("/upload")
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(@DefaultValue("") @FormDataParam("tags") String tags,
@FormDataParam("file") InputStream file,
@FormDataParam("file") FormDataContentDisposition fileDisposition) {
String fileName = fileDisposition.getFileName();
saveFile(file, fileName);
String fileDetails = "File saved at /Volumes/Drive2/temp/file/" + fileName + " with tags "+ tags;
System.out.println(fileDetails);
return Response.ok(fileDetails).build();
}
private void saveFile(InputStream file, String name) {
try {
/* Change directory path */
java.nio.file.Path path = FileSystems.getDefault().getPath("/Volumes/Drive2/temp/file/" + name);
/* Save InputStream as file */
Files.copy(file, path);
} catch (IOException ie) {
ie.printStackTrace();
}
}
答案 1 :(得分:0)
我输了错误的卷曲命令
Correct Curl命令:
curl -H "Authorization: Bearer db4719e2-dd76-4977-9dab-e44670213c63" -F "image=@kreditech.jpg" localhost:8080/api/secure/images/upload