Java文件上传以及Jersey静态Web服务中的其他对象

我想通过上传图像和员工数据来在系统中创建员工信息。我可以使用球衣使用其他休息电话来做到这一点。但我想在一个电话会议中实现。我在下面提供结构。请帮我在这方面怎么做。

@POST

@Path("/upload2")

@Consumes({MediaType.MULTIPART_FORM_DATA,MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})

public Response uploadFileWithData(

@FormDataParam("file") InputStream fileInputStream,

@FormDataParam("file") FormDataContentDisposition contentDispositionHeader,

Employee emp) {

//..... business login

}

每当我尝试执行此操作时,Chrome邮递员都会出现错误。我的Employee json的简单结构如下。

{

"Name": "John",

"Age": 23,

"Email": "john@gmail.com",

"Adrs": {

"DoorNo": "12-A",

"Street": "Street-11",

"City": "Bangalore",

"Country": "Karnataka"

}

}

但是,我可以通过拨打两个不同的电话来做到这一点,但我想在一个休息电话中实现,这样我就可以接收文件以及员工的实际数据。

请你在这方面提供帮助。

回答:

你不能有两个Content-Types(从技术上讲,这是我们在下面执行的操作,但是它们与multipart的每个部分都分开,但是主要类型是multipart)。这基本上就是你对方法的期望。你期望mutlipartjson一起作为主要媒体类型。该Employee数据需要多部分的一部分。所以,你可以添加@FormDataParam("emp")Employee

@FormDataParam("emp") Employee emp) { ...

这是我用来测试的课程

@Path("/multipart")

public class MultipartResource {

@POST

@Path("/upload2")

@Consumes({MediaType.MULTIPART_FORM_DATA})

public Response uploadFileWithData(

@FormDataParam("file") InputStream fileInputStream,

@FormDataParam("file") FormDataContentDisposition cdh,

@FormDataParam("emp") Employee emp) throws Exception{

Image img = ImageIO.read(fileInputStream);

JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(img)));

System.out.println(cdh.getName());

System.out.println(emp);

return Response.ok("Cool Tools!").build();

}

}

首先,我刚刚使用客户端API进行了测试,以确保它可以正常工作

@Test

public void testGetIt() throws Exception {

final Client client = ClientBuilder.newBuilder()

.register(MultiPartFeature.class)

.build();

WebTarget t = client.target(Main.BASE_URI).path("multipart").path("upload2");

FileDataBodyPart filePart = new FileDataBodyPart("file",

new File("stackoverflow.png"));

// UPDATE: just tested again, and the below code is not needed.

// It's redundant. Using the FileDataBodyPart already sets the

// Content-Disposition information

filePart.setContentDisposition(

FormDataContentDisposition.name("file")

.fileName("stackoverflow.png").build());

String empPartJson

= "{"

+ " \"id\": 1234,"

+ " \"name\": \"Peeskillet\""

+ "}";

MultiPart multipartEntity = new FormDataMultiPart()

.field("emp", empPartJson, MediaType.APPLICATION_JSON_TYPE)

.bodyPart(filePart);

Response response = t.request().post(

Entity.entity(multipartEntity, multipartEntity.getMediaType()));

System.out.println(response.getStatus());

System.out.println(response.readEntity(String.class));

response.close();

}

我刚刚创建了一个简单的Employee类,id并带有and name字段进行测试。这工作得很好。它显示图像,打印内容配置,然后打印Employee对象。

我对Postman不太熟悉,所以我将测试保存到最后

如你所见,它似乎也可以正常工作”Cool Tools”。但是,如果我们查看打印的Employee数据,就会发现它为空。这很奇怪,因为使用客户端API可以正常工作。

如果我们查看“预览”窗口,就会发现问题所在

主体部分没有Content-Type标题emp。你可以在客户端API中看到我明确设置了它

MultiPart multipartEntity = new FormDataMultiPart()

.field("emp", empPartJson, MediaType.APPLICATION_JSON_TYPE)

.bodyPart(filePart);

因此,我想这实际上只是完整答案的一部分。就像我说的,我对邮递员不熟悉,所以我不知道如何Content-Type为身体的各个部位设置s。在image/png对图像进行自动为我设置的图像部分(我猜它只是由文件扩展名确定)。如果你能解决这个问题,那么应该解决问题。请,如果你知道如何执行此操作,请将其发布为答案。

请参阅此处以了解更多有关MultiPart with Jersey的信息。

基本配置:

依赖关系:

<dependency>

<groupId>org.glassfish.jersey.media</groupId>

<artifactId>jersey-media-multipart</artifactId>

<version>${jersey2.version}</version>

</dependency>

客户端配置:

final Client client = ClientBuilder.newBuilder()

.register(MultiPartFeature.class)

.build();

服务器配置:

// Create JAX-RS application.

final Application application = new ResourceConfig()

.packages("org.glassfish.jersey.examples.multipart")

.register(MultiPartFeature.class);

因此,从Postman客户端可以看到,某些客户端无法设置各个部分的Content-Type,包括浏览器,这是使用FormData(js)时的默认功能。

我们不能指望客户能找到解决办法,因此我们可以做的就是在接收数据时在反序列化之前显式设置Content-Type。例如

@POST

@Path("upload2")

@Consumes(MediaType.MULTIPART_FORM_DATA)

public Response uploadFileAndJSON(@FormDataParam("emp") FormDataBodyPart jsonPart,

@FormDataParam("file") FormDataBodyPart bodyPart) {

jsonPart.setMediaType(MediaType.APPLICATION_JSON_TYPE);

Employee emp = jsonPart.getValueAs(Employee.class);

}

获取POJO会花费一些额外的工作,但是比强迫客户端尝试找到自己的解决方案要好。

如果你使用的连接器不同于默认的HttpUrlConnection,则你可能会对这些注释中的对话感兴趣。

以上是 Java文件上传以及Jersey静态Web服务中的其他对象 的全部内容, 来源链接: utcz.com/qa/397786.html

回到顶部