目录
一、处理JSON
二、HttpMessageConverter
1、源码解析装配Converters
2、使用 HttpMessageConverter
三、文件上传下载
1、环境配置
2、上传单个文件
3、上传多个文件
4、下载
1、加入jackson的jar
com.fasterxml.jackson.core
jackson-core
2.9.6
com.fasterxml.jackson.core
jackson-databind
2.9.6
com.fasterxml.jackson.core
jackson-annotations
2.9.6
2、添加@ResponseBody注解,返回集合对象。
@ResponseBody
@RequestMapping("/testJson")
public List testJson() {
List list = new ArrayList<>();
list.add(new User(1, "Tom", "123456", "[email protected]", 13));
list.add(new User(2, "Jaer", "123456", "[email protected]", 11));
list.add(new User(3, "Nitty", "123456", "[email protected]", 12));
return list;
}
3、返回数据:
HttpMessageConverter
HttpMessageConverter
查看DispatcherServlet的doDispatch方法,找到handlerAdapters属性,展开找到RequestMappingHandlerAdapter,找到其中的messageConverters,查看装配的Converters:
加入 jackson jar 包后, HttpMessageConverter装配的增加第六个Converter。
使用 HttpMessageConverter
当控制器处理方法使用到 @RequestBody/@ResponseBody 或HttpEntity
HttpMessageConverter 将报错
@RequestBody 和 @ResponseBody 不需要成对出现
1、@RequestBody、@ResponseBody示例,实现文件上传效果:
@ResponseBody
@RequestMapping("/testHttpMessageConverter")
public String testHttpMessageConverter(@RequestBody String body){
System.out.println(body);
return "helloworld! " + new Date();
}
2、ResponseEntity实现文件下载效果:
@RequestMapping("/testResponseEntity")
public ResponseEntity testResponseEntity(HttpSession session) throws IOException{
byte [] body = null;
ServletContext servletContext = session.getServletContext();
InputStream in = servletContext.getResourceAsStream("/files/abc.txt");
body = new byte[in.available()];
in.read(body);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment;filename=abc.txt");
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity response = new ResponseEntity(body, headers, statusCode);
return response;
}
Test ResponseEntity
加入支持的jar:
commons-io
commons-io
2.4
commons-fileupload
commons-fileupload
1.3.1
配置MultipartFile
页面代码:
后台:
@RequestMapping("/testFileUpload")
public String testFileUpload(@RequestParam("desc") String desc, @RequestParam("file") MultipartFile file)
throws IOException {
if (!file.isEmpty()) {
/*
* MultipartFile 常用方法
*/
// 获取参数的名称
String name = file.getName();
// 获取文件的原名称
String originalFilename = file.getOriginalFilename();
// 文件内容的类型
String contentType = file.getContentType();
// 文件是否为空
boolean empty = file.isEmpty();
// 文件大小
long size = file.getSize();
// 将文件内容以字节数组的形式返回
byte[] bytes = file.getBytes();
// 将文件内容以输入流的形式返回
InputStream inputStream = file.getInputStream();
System.out.println(name + "\n" + originalFilename + "\n" + contentType + "\n" + empty + "\n" + size + "\n"
+ inputStream);
/*
* 存放上传的文件
*/
String path = "D:/temp/";
String fileName = file.getOriginalFilename();
File temp = new File(path, fileName);
file.transferTo(temp);
}
return "success";
}
页面代码:
后台:
@RequestMapping("/testFileUpload2")
public String testFileUpload2(@RequestParam("desc") String desc, @RequestParam("files") MultipartFile[] files)
throws IOException {
String path = "D:/temp/";
// 判断file数组不能为空并且长度大于0
if (files != null && files.length > 0) {
// 循环获取file数组中得文件
for (int i = 0; i < files.length; i++) {
MultipartFile file = files[i];
// 保存文件
String fileName = file.getOriginalFilename();
File temp = new File(path, fileName);
file.transferTo(temp);
}
}
return "success";
}
1、方式一:
@RequestMapping("/testFileDownload")
public ResponseEntity downloadResumeFile() throws Exception {
// 下载文件名称
String fileName = "新建文本文档.txt";
// 下载文件路径
String realPath = "D:/temp";
File file = new File(realPath + File.separator + fileName);
InputStream in = new FileInputStream(file);// 将该文件加入到输入流之中
byte[] body = null;
// 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数
body = new byte[in.available()];
// 读入到输入流里面
in.read(body);
// 下载显示的文件名,解决中文名称乱码问题
fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
HttpHeaders headers = new HttpHeaders();
// 设置响应头// 通知浏览器以attachment(下载方式)打开图片
headers.add("Content-Disposition", "attachment;filename=" + fileName);
HttpStatus statusCode = HttpStatus.OK;// 设置响应吗
ResponseEntity responseEntity = new ResponseEntity(body, headers, statusCode);
return responseEntity;
}
2、方式二:
@RequestMapping(value = "/download")
public ResponseEntity download(HttpServletRequest request, @RequestParam("filename") String filename,
Model model) throws Exception {
// 下载文件路径
String path = request.getServletContext().getRealPath("/images/");
File file = new File(path + File.separator + filename);
HttpHeaders headers = new HttpHeaders();
// 下载显示的文件名,解决中文名称乱码问题
String downloadFielName = new String(filename.getBytes("UTF-8"), "iso-8859-1");
// 通知浏览器以attachment(下载方式)打开图片
headers.setContentDispositionFormData("attachment", downloadFielName);
// application/octet-stream : 二进制流数据(最常见的文件下载)。
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}