我们先说一下文件上传。什么是文件上传呢?文件上传就是将本地的文件以流的形式写入到服务器的过程。
如何要实现文件上传,我们必须要实现三大要素。
1、表单提交的方式必须是post。因为get方法提交的数据有容量的限制,而且最大也只有几KB。而post方式没有数据大小容量的限制。
2、表单中选择文件的按钮,必须要赋予name属性值。
3、表单的enctype属性要改为multipart/form-data。不修改的话,只会上传文件的名字,不会上传文件的内容。
下面就是我实现文件上传的小demo。
UploadController类代码
package com.load.controller;
import com.load.utils.StringUtils;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
/**
* 这是一个文件上传的demo
*/
@Controller
@ResponseBody
public class UploadController {
@PostMapping("/up")
public void accept(MultipartFile upload) {
//判断文件是否为空
if(upload.isEmpty()!=true){
//获得文件名
String name=upload.getOriginalFilename();
//对文件名进行加工
String filename=StringUtils.add(name);
//获得目标文件夹路径
ApplicationHome app=new ApplicationHome(getClass());
String dirpath=app.getSource().getParentFile().toString();
String filepath=dirpath+"\\classes\\upload\\";
File dest=new File(filepath+filename);
try {
//保存文件
upload.transferTo(dest);
System.out.println("上传成功");
} catch (IOException e) {
e.printStackTrace();
System.out.println("上传失败");
}
}
else {
System.out.println("上传文件为空!");
}
}
}
StringUtils类
package com.load.utils;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
/***
* 对上传的文件的名字进行加工
*/
public class StringUtils {
public static String add(String str){
System.out.println(str);
String name[]=str.split("\\.");
System.out.println(Arrays.toString(name));
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
String filename=name[0]+"-"+sdf.format(date)+"."+name[1];
return filename;
}
}
上传网页代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="/up" enctype="multipart/form-data">
<input type="file" name="upload">
<br/>
<input type="submit" value="上传">
</form>
</body>
</html>
下面我们说一下,什么是文件下载?
文件下载就是把服务器端的文件以流的形式写入到客户端上。
要实现文件下载,主要是实现以下三个步骤:
1、要设置文件的MIME类型,不同的文件的MIME类型也不一样。我们可以通过ServletContext的getMimeType方法来获得文件的MIME类型。
2、要设置response的Content-Disposition头信息,设置下载文件的文件名。
3、最后将response的输入流和下载文件的输入流进行对接。
下面就是我实现文件下载的小demo。
DownloadController类
package com.load.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@Controller
public class DownloadController {
@RequestMapping("/download")
@ResponseBody
public void download(HttpServletRequest request,HttpServletResponse response) {
//要上传的文件名字
String fileName = "water.jpg";
//通过文件的保存文件夹路径加上文件的名字来获得文件
String FILE_DIR="src\\main\\resources\\download";
File file = new File(FILE_DIR, fileName);
//当文件存在
if (file.exists()) {
//首先设置响应的内容格式是force-download,那么你一旦点击下载按钮就会自动下载文件了
String type=request.getServletContext().getMimeType(fileName);
response.setContentType(type);
//通过设置头信息给文件命名,也即是,在前端,文件流被接受完还原成原文件的时候会以你传递的文件名来命名
response.addHeader("Content-Disposition","attachment; filename="+file.getName());
//进行读写操作
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
//从源文件中读
int i = bis.read(buffer);
while (i != -1) {
//写到response的输出流中
os.write(buffer, 0, i);
i = bis.read(buffer);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//善后工作,关闭各种流
try {
if (bis != null) {
bis.close();
}
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
else {
System.out.println("文件不存在!");
}
}
}
下载网页代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
water.jpg图片下载<br/>
<a href="/download">下载</a>
</body>
</html>