1、代码实现 FileUtils
package com.microplay.util.file;
import com.microplay.util.dateTime.MPDateUtils;
import com.microplay.util.uuid.UuidUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
/**
* 文件操作相关
*/
@Component
public class FileUtils {
/**
* 文件地址,按照年月日存储
* <p>
* filePath 文件上传路径
* uploadFolder 文件夹名称
*/
private static String filePath;
private static String fileFolder = "uploadFolder";
@Autowired
private ResourceLoader resourceLoader;
@Autowired
private static ResourceLoader satticResourceLoader;
@PostConstruct
public void init() {
satticResourceLoader = resourceLoader;
try {
filePath = new File("").getCanonicalPath() + "/" + fileFolder + "/";
} catch (Exception e) {
throw new RuntimeException("获取文件基本路径失败");
}
}
/**
* 文件上传 单个
*/
public static String upload(MultipartFile file) {
try {
String fileName = file.getOriginalFilename();
String suffix = fileName.split("\.")[1];
String newFileName = MPDateUtils.getYear() + "/" +
MPDateUtils.getMonth() + "/" +
MPDateUtils.getDay() + "/" +
UuidUtils.getUUID() + "." + suffix;
String newPath = filePath + newFileName;
// 判断当前文件夹是否存在
File oldFile = new File(newPath);
if (!oldFile.getParentFile().exists()) {
oldFile.getParentFile().mkdirs();
}
File file2 = new File(newPath);
file.transferTo(file2);
return newFileName;
} catch (IOException e) {
throw new RuntimeException("文件上传失败");
}
}
/**
* 文件上传 多个
*/
public static List<String> uploads(List<MultipartFile> files) {
List<String> result = new ArrayList<>();
for (MultipartFile file : files) {
result.add(upload(file));
}
return result;
}
/**
* 文件显示
*/
public static ResponseEntity show(String fileName) {
try {
// 由于是读取本机的文件,file是一定要加上的, path是在application配置文件中的路径
return ResponseEntity.ok(satticResourceLoader.getResource("file:" + filePath + fileName));
} catch (Exception e) {
return ResponseEntity.notFound().build();
}
}
/**
* 文件下载
*/
public static void download(String fileName, HttpServletResponse response) {
OutputStream toClient = null;
try {
// path是指欲下载的文件的路径。
File file = new File(filePath + fileName);
// 取得文件名。
String filename = file.getName();
// 取得文件的后缀名。
String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(filePath + fileName));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 如果是图片就预览,不是图片就下载
if (fileName.endsWith("jpg") || fileName.endsWith("png") || fileName.endsWith("gif")) {
response.setHeader("Content-Type", "image/jpeg");
} else {
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
response.setContentType("application/octet-stream; charset=utf-8");
}
response.addHeader("Content-Length", "" + file.length());
response.setHeader("Access-Control-Allow-Origin", "*");
toClient = new BufferedOutputStream(response.getOutputStream());
toClient.write(buffer);
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
toClient.flush();
toClient.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("文件上传关闭流失败!");
}
}
}
/**
* 文件删除
*
* @param fileName 文件路径
* @return false、true
*/
public static void delete(String fileName) {
try {
File file = new File(filePath + fileName);
file.delete();
} catch (Exception e) {
throw new RuntimeException("文件删除失败");
}
}
/**
* 从网络中下载文件
*
* @param filePath 网络文件地址
*/
public static void downloadByNetwork(HttpServletResponse response, String filePath) {
InputStream inputStream = null;
try {
URL url = new URL(filePath);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
int httpRequestCode = con.getResponseCode();
if (httpRequestCode != 200) {
throw new Exception("文件下载错误,错误码:" + httpRequestCode);
}
// 将文件读入文件流
inputStream = con.getInputStream();
// 下载文件的名称
String[] fileSplit = filePath.split("/");
String finalFileName = fileSplit[fileSplit.length - 1];
// 设置HTTP响应头
// 重置 响应头
response.reset();
// 告知浏览器下载文件,而不是直接打开,浏览器默认为打开
response.setContentType(URLConnection.getFileNameMap().getContentTypeFor(filePath));
response.addHeader("Content-Disposition", "attachment;filename=" + finalFileName);
// 循环取出流中的数据
byte[] b = new byte[1024];
int len;
while ((len = inputStream.read(b)) > 0) {
response.getOutputStream().write(b, 0, len);
}
} catch (Exception e) {
throw new RuntimeException("从网络中下载文件失败");
} finally {
try {
inputStream.close();
response.getOutputStream().close();
} catch (Exception e) {
throw new RuntimeException("文件流关闭失败");
}
}
}
}
2、控制层
package com.microplay.business.test.controller;
import com.microplay.config.jwt.JwtIgnore;
import com.microplay.util.file.FileUtils;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping(value = "file", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class TestController {
/**
*
* @param file
* @return
*/
@PostMapping("upload")
@JwtIgnore
public String upload(@RequestBody MultipartFile file) {
return FileUtils.upload(file);
}
@PostMapping("uploads")
@JwtIgnore
public List<String> uploads(@RequestBody List<MultipartFile> files) {
List<String> stringList = FileUtils.uploads(files);
return stringList;
}
@PostMapping("delete")
@JwtIgnore
public void delete(String filePath) {
FileUtils.delete(filePath);
}
@GetMapping("download")
@JwtIgnore
public void download(HttpServletResponse response, String filePath) {
FileUtils.download(filePath, response);
}
/**
* 显示单张图片
* @return
*/
@RequestMapping("show")
@JwtIgnore
public ResponseEntity shows(String filePath){
return FileUtils.show(filePath);
}
/**
* 下载网络资源
* @param response
* @param fileUrl
* @return
*/
@GetMapping("downloadByNetwork")
@JwtIgnore
public void downloadByNetwork(HttpServletResponse response, String fileUrl) {
Map<String, String> params = new HashMap<String, String>();
FileUtils.downloadByNetwork(response, fileUrl);
}
}
3、视频讲解
https://www.bilibili.com/video/BV1kf4y1i761?p=7