我正在使用Spring框架实现RESTful webservice。在某种情况下,我需要接受请求正文的字段将是文件(PDF或图像)的请求。我的请求正文如下:
{
"id" : "101",
"name" : "John",
"report" :
}
以上请求正文中的报告字段将是一个文件(PDF或图片)。 我读了很多关于此的文章,但无法得到正确的答案。我得到了单独接受文件但不作为请求体的字段提交的解决方案 请帮帮我
答案 0 :(得分:3)
好的,有很多方法可以解决这个问题。我将解释一种这样的方法。
第1步:创建StudentReport课程。
注意这里使用的byte []数组。
public class StudentReport {
private long id;
private String Name;
byte[] report;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public byte[] getReport() {
return report;
}
public void setReport(byte[] report) {
this.report = report;
}
}
第2步:创建所需的休息终点。
我想告诉你一些事情。 Json必须作为字符串发送到终点并保持报告为空。这将通过seperatley如下所示。
@RestController
@RequestMapping("/NameYourController/")
public class MyController{
@RequestMapping(value = "addDetails", method = RequestMethod.POST , consumes = "multipart/form-data")
public StudentReport addProduct(@RequestParam String studentReportJson, @RequestParam MultipartFile report) throws JsonParseException, JsonMappingException, IOException {
//Convert your Json in Strign format as actual object
StudentReport studentReport = new ObjectMapper().readValue(studentReportJson, StudentReport.class);
//convert file to byte array
byte[] myReport = report.getBytes();
studentReport.setReport(myReport);
// Now, pdf is set in the object
// do whatever you want to do with it like save in database etc
//based on that , have some return type defined. I have just used returned the object in this example .
return studentReport; // Spring boot auto converts this object to Json when send to UI.Note that Json is an object and Json String is string object consisting of Json. We recieved Json String but returning Json object
}
//and other endpoints you want to define
}
就是这样。请注意,为此您需要导入Jackson库。如果您使用的是Maven,可以在pom.xml中添加它。
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.12</version>
</dependency>
现在,您将如何测试您的休息终点。一种方法将来自UI代码,它将使用这些。但是请确保该代码是正确的。如果您还没有UI代码,则可以执行此操作。这是由Chrome应用PostMan完成的。但是,为此你需要使用chrome web浏览器。
Youtube有很多关于如何使用PostMan的视频。我将为您提供一个如何在您的案例中专门使用的屏幕截图:
注意图片中的这些内容 - &gt; POST,URL路径,BODY,表单数据,TEXT,FILE。 :)
如果您有一些返回数据,输出将显示在邮递员的下方。(图中未显示)
答案 1 :(得分:0)
JSON不支持二进制数据。您必须将文件编码为Base64字符串并附加它。
{
"id" : "101",
"name" : "John",
"report" : "/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDxyiiiv3E8wKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z"
}
以上Base64编码适用于here
的图像文件答案 2 :(得分:0)
您必须使用@RequestParam或@RequestPart来发送和处理文件。使用@ResponseBody并非不可能,但为此您必须编写自定义转换器。
public String handleFileUpload(@RequestParam("file") MultipartFile file,
RedirectAttributes redirectAttributes) {
// Your File Processing goes here
}