Avi*_*ash 2 java json spring-mvc multipart jackson
我正在使用 Spring-MVC 3.0,在我的应用程序中,我发送一些带有多个附件的信息,并且每个文件都有标题、ID 等。因此,我制作了一个 DTO,如下所示
public class MyDTO {
Long id;
Integer age;
MultipartFile infoFile;
// getter setter
Run Code Online (Sandbox Code Playgroud)
我只是JSON根据JS文件中的上述 DTO 类创建一个对象。
这是我的Controller映射:
@RequestMapping(value = "/saveInfo", method = RequestMethod.POST)
public @ResponseBody String saveInfo(
@RequestParam(value = "data", required = true) String stdData,
@RequestParam(value = "fileData", required = false) MultipartFile[] files,
HttpSession session,HttpServletRequest request) {
MyDTO dto;
try {
dto = mapper.readValue(stdData, new TypeReference<MyDTO>() {});
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
org.codehaus.jackson.map.JsonMappingException: Can not construct instance of org.springframework.web.multipart.commons.CommonsMultipartFile,
problem: no suitable creator method found to deserialize from JSON String
at [Source: java.io.StringReader@19747c9; line: 1, column: 336] (through reference chain: com.avi.dto.MyDTO["hbvFile"])
Run Code Online (Sandbox Code Playgroud)
事实上我自己找到了答案。我们无法直接以 JSON 对象发送文件。对象File不保存文件,它保存文件的路径,即。C:/hi.txt。如果这就是我们放入 JSON 中的内容,它将生成
{"File" : "C:/hi.txt"}
它不会包含文件内容。所以我们不妨直接输入文件路径
JSONObject my_data = new JSONObject();
my_data.put("User", "Avi");
my_data.put("Date", "22-07-2013");
my_data.put("File", "C:/hi.txt");
Run Code Online (Sandbox Code Playgroud)
如果您尝试使用 JSON 进行文件上传,一种方法是使用 Java 7 的 NIO 从文件中读取字节
byte[] bytes = Files.readAllBytes(file_upload .toPath());
Run Code Online (Sandbox Code Playgroud)
Base64 对这些字节进行编码并将它们作为字符串写入 JSONObject 中。使用 Apache Commons 编解码器
Base64.encodeBase64(bytes);
my_data.put("File", new String(bytes));
Run Code Online (Sandbox Code Playgroud)
94 Unicode根据 JSON 规范,有些字符可以表示为一个字节(如果您的 JSON 以 UTF-8 传输)。
| 归档时间: |
|
| 查看次数: |
8702 次 |
| 最近记录: |