springMvc-06 JSON与文件上传下载
1、Json
JSON是当前前后端分开开发传递数据首选的数据格式。
这里使用jackson开源包实现JSON数据解析转换。
1.1、导入所需要的包
<!--JSON数据转换-->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.12.2</version>
</dependency>
1.2、两个注解
@RequestBody
主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);
必须是Post请求,该注解用在方法的形参上。
当请求头的ContentType类型是application/json,application/xml等格式的数据时,需要使用该标注。
能够把json内部包含的变量绑定给对象的包含的属性上。
@ResponseBody
用于返回JSON数据,该注解用在方法上,用来把方法返回的对象自动转为JSON格式并返回给前端。
1.3、测试例子
代码:
package rui.web;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import rui.db.Model.User;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
@Controller
@RequestMapping(value = "/json")
public class jsonController {
//提交Json数据
@ResponseBody
@RequestMapping(value = "put")
public void showInfo(
HttpServletResponse response,
@RequestBody User user) throws Exception {
System.out.println("提交JSON数据");
System.out.println(user.toString());
ObjectMapper jsonTool = new ObjectMapper();
response.getWriter().write(jsonTool.writeValueAsString(user));
}
//返回Json数据
@ResponseBody
@RequestMapping(value = "get")
public User showInfo() {
User u = new User();
u.setLoginId("001");
u.setUserName("王");
u.setSex("F");
u.setTelephone("123456789");
u.setDepartmentId("D01");
u.setLoves(Arrays.asList("足球", "篮球"));
return u;
}
}
请求测试-请求:

请求测试-提交:用Postman
在Header中增加Content-Type application/json

数据输出:

2、文件上传与下载
2.1、导入包
<!--文件上传-->
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
2.2、SpringMVC配置文件添加如下配置
<!--文件上传配置-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--默认编码-->
<property name="defaultEncoding" value="UTF-8" />
<!--最大上传200M-->
<property name="maxUploadSize" value="209715200" />
<!--推迟文件解析-->
<property name="resolveLazily" value="true" />
<!--临时保存路径-->
<property name="uploadTempDir" value="uploadFiles/temp" />
</bean>
2.3、文件上传
前端通过 input表单上传,允许文件多选
<div>头像:<input type="file" name="headImgUpload" multiple="multiple" /></div>
form标记需要增加: enctype="multipart/form-data" 属性。
保存文件的代码:
参数名需要和input表单的name属性保持一致,否则无法进行参数绑定。
//用户注册提交
@RequestMapping(value = "register", method = RequestMethod.POST)
public String register(Model model,User user,
List<MultipartFile> headImgUpload,
HttpServletRequest request) {
System.out.println("执行TestController==2");
//文件上传保存
if (headImgUpload != null) {
for (MultipartFile headImg:headImgUpload) {
String realPath = request.getServletContext().getRealPath("uploadFiles");
System.out.println(realPath);
File file = new File(realPath);
//不存在,则创建目录
if (file.exists() == false)
file.mkdir();
if (headImg.getSize() > 0) {
//获取上传文件名
String fileName = headImg.getOriginalFilename();
System.out.println(fileName);
System.out.println(headImg.getContentType());
System.out.println(headImg.getSize());
File target = new File(realPath, fileName);
try {
//保存文件
headImg.transferTo(target);
} catch (Exception e) {
System.out.println("上传失败");
e.printStackTrace();
}
}
}
}
model.addAttribute("user", user);
return "forward:/test/showInfo";
}
2.4、文件下载
//文件下载
@RequestMapping(value="download")
public ResponseEntity<byte[]> downloadFile(String fileName,
HttpServletRequest request,
HttpServletResponse response) throws Exception
{
String downLoadPath = request.getServletContext().getRealPath("downloadFiles");
System.out.println(downLoadPath);
File downFile = new File(downLoadPath+File.separator+fileName);
if(downFile.exists())
{
HttpHeaders headers=new HttpHeaders();
//解决中文乱码
String downFileName = new String(downFile.getName().getBytes("utf-8"),"iso-8859-1");
headers.setContentDispositionFormData("attachment",downFileName);
//设置要下载文件的MIME类型,这句话可以省略
headers.setContentType("文件的MIME类型");
byte[] buffer = FileUtils.readFileToByteArray(downFile);
ResponseEntity<byte[]> entity=new ResponseEntity<byte[]>(buffer,headers, HttpStatus.OK);
return entity;
}
return null;
}
运行测试:
在浏览器中输入:

项目中,文件路径一般都保存在数据库中,通过传入要下载的文件的数据库记录主键,通过查询数据库来获取其它相关的信息。

浙公网安备 33010602011771号