文件的下载
获得服务器文件的根路径
String realPath=servletContext.getRealPath("/");
realPath:
E:\SpringMVC\Springmvc-project1\Springmvc-demo2\target\Springmvc-demo2-1.0-SNAPSHOT\
获得根路径之后在跟路径后面加上我想创建的层次名和文件名,可以直接这样写:
String realPath=servletContext.getRealPath("/static/img/1.jpg");
realPath:
E:\SpringMVC\Springmvc-project1\Springmvc-demo2\target\Springmvc-demo2-1.0-SNAPSHOT\static\img\1.jpg
@Controller
public class FileUpAndDown {
@RequestMapping("/download")
public ResponseEntity downloadfile(HttpSession session)throws IOException
{
// 获取servletcontext对象(就是application对象,通过它可以读取配置文件,javaweb基础)
ServletContext servletContext=session.getServletContext();
// 获得要下载文件在服务器中存放的真实地址
String realPath=servletContext.getRealPath("/static/img/1.jpg");
// 获得文件地址的输入字节流
InputStream is=new FileInputStream(realPath);
// 获得输入文件的字节流的长度 is.available()代表字节流的长度
byte[] bytes=new byte[is.available()];
// 将输入流中的数据放到字节数组中
// bytes就是下载文件的字节流,就是响应体
is.read(bytes);
// 创建HttpHeaders对象设置响应头信息
MultiValueMap headers=new HttpHeaders();
// 在multivaluemap对象中,设置下载方式(附件形式) 下载的文件名
headers.add("Content-Disposition","attachment;filename=1.jpg");
// 设置响应状态码
HttpStatus status=HttpStatus.OK;
// 创建ResponseEntity对象 bytes 文件的字节流也就是响应体,
// header文件的下载方式,文件临时名称 status 下载状态码,ok表示成功200
ResponseEntity responseEntity=new ResponseEntity<>(bytes,headers,status);
// 关闭输入流
is.close();
return responseEntity;
}
文件的上传
不能使用get请求,只能使用post请求
文件上传要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data"
SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息
上传步骤:
a>添加依赖:
commons-fileupload
commons-fileupload
1.3.1
b>在SpringMVC的配置文件中添加配置:
c>控制器方法:
先把文件要存放在服务器的地址的绝对路径找出来,之后直接 photo.transferTo(file);即可
//先把文件要存放在服务器的地址的绝对路径找出来,之后直接 photo.transferTo(file);即可
@RequestMapping("/upload")
// MultipartFile 对应 java中的File类型
public String upanddown(MultipartFile photo, HttpSession session) {
System.out.println("开始上传文件");
System.out.println("要上传的文件的photo中是:" + photo);
// 获得真实的文件名 filename:node.dll
String filename = photo.getOriginalFilename();
// 获得真实文件名的后缀 .html .java
String suffixName = filename.substring(filename.lastIndexOf("."));
// 随机生成一个文件名
String uuid = UUID.randomUUID().toString();
// 将随机生成的文件名和后缀拼接,就可以获得要存放的文件名,这样就可以避免文件名重复的问题
filename = uuid + suffixName;
System.out.println("真实的文件名filename是" + filename);
// 获得servletcontext对象
ServletContext servletContext = session.getServletContext();
// 获得文件上传之后,放置该文件的文件夹在服务器的真实路径 (就是文件夹的绝对路径)
// E:\SpringMVC\Springmvc-project1\Springmvc-demo4\target\Springmvc-demo4-1.0-SNAPSHOT\photo
String photopath = servletContext.getRealPath("photo");
File file = new File(photopath);//获取该文件夹
System.out.println("接收该文件的文件夹在服务器上的绝对路径:" + photopath);
// 检查该photopath路径是否存在,不存在就创建该文件夹
System.out.println("file" + file);
if (!file.exists()) {
file.mkdir();
}
// 拼接出最后文件的路径
//E:\SpringMVC\Springmvc-project1\Springmvc-demo4\target\Springmvc-demo4-1.0-SNAPSHOT\photo\f772f503-b660-4d13-afbf-e903d911fc7b.html
String finalpath = file + File.separator + filename;
try {
photo.transferTo(new File(finalpath));//核心语句,将photo上传到file文件中
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}