文件的上传和下载是每一个的系统中必备的功能,本文章详细解释“文件的上传与下载”的全部过程。
文件的上传
文件的上传也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览和下载的过程。文件上传在项目中应该非常广泛。我们经常发的微信朋友圈等。
文件上传前端的要求
文件上传时,对页面的from表单有以下几个要求
1 method ="post" 采用post方式提交数据
2 enctype = "multipart/from-data" 采用nultipart格式上传文件
3 trpe = "file" 使用input控件上传
【例子】:<from method ="post" action ="/common/upload" enctype ="multpart/from-data">
<input name ="myFile" type = "file">
<input type ="submit value = "提交">
<from>
服务端接收文件
服务端要接收客户端页面上传到的文件,通常都会使用Apache的两个组件:
1 commons-fileupload
2 commons-io
在spring框架在spring-web包中对文件上传进行了封装,大大简化了服务端的代码,我们只需要在Controller方法中声明一个Multipart类型的参数即可接收上传的文件。
后端具体代码的编写:
这个代表的是上传图片在电脑保存的位置,一般把路径放在配置文件中,便于修改。
@Value("${reggie.path}")
private String basePath;
@PostMapping("/upload")
public Result<String> upload(MultipartFile file){
//获得原始的文件名
String filename = file.getOriginalFilename();
//截取后面的文件格式后缀
String suffix = filename.substring(filename.lastIndexOf("."));
//使用UUID重新生成文件名称,防止文件名称重复
String filenames = UUID.randomUUID().toString() +suffix;
//创建一个新的目录
File file1 = new File(basePath);
//判断保存的时候是否存在一个这样的目录,如果存在的话,则保存,如果不存在则创建一个
if (!file1.exists()){
//目录不存在,则创建
file1.mkdirs();
}
try {
//这里就会得到一个上传到图片的,完后将临时图片转存到指定位置
file.transferTo(new File(basePath + filenames));
} catch (IOException e) {
e.printStackTrace();
}
//返回文件名称,保存到数据库中
return Result.success(filenames);
}
具体的实现步骤:
1、定义一个方法MultipartFile 作为参数,传进去
2、我们通过MultipartFile得到的图片是一个临时文件,我们需要调用transferTo()方法,将临时文件转存到那个位置。
3、在我们的配置文件中顶一个这样的路径去保存图片,并通过@Value来注入进来,就是上面的basePath
4、来获得文件的原始名字,并通过substring()来截取文件的后缀
5、我们使用UUID这个类重新生成新的文件名。
6、就是在保存到的时候,判断目录是否存在,不存在就生成一个新的目录。
文件的下载
文件的下载也称为download,是指文件从服务器传输到本地计算机的过程
通过浏览器进行文件的下载,通常有两种表现的形式:
1、以附件的形式下载,弹出保存对话框。将文件保存到指定磁盘目录
2、直接在浏览器中打开
通过浏览器进行文件的下载,本质上就是服务端将文件以流的形式写回到浏览器的过程
后端代码的具体编写
@GetMapping("/download")
public void download(String name , HttpServletResponse response){
try {
//输入流,通过输入流读取文件内容
FileInputStream fileInputStream = new FileInputStream(new File(basePath+name));
//输出流,通过输出流将文件写回浏览器,在浏览器中展示图片了
ServletOutputStream outputStream = response.getOutputStream();
//设置响应的格式
response.setContentType("image/jpeg");
int len =0;
//读到的放到这个数组里面
byte[] bytes = new byte[1024];
while ((len=fileInputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
outputStream.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
具体的实现步骤:
1、定义一个输入流,通过输入流来读取文件内容
2、定义一个输出流,通过输出流将文件回显到浏览器,从而显示东西
3、设置一个响应格式
4、定义一个变量,将读到数据保存到变量中
5、再判断,当读完以后,通过write方法来回显
6、刷新流,并且关闭流。