本章分享大家项目经验,实现图片或文件的上传和下载,相信大家对于文件保存位置,
以及不同系统分隔符号不同,也会导致文件保存下载失败,今天将帮助大家解决此疑惑。
package com.sf.vsolution.hb.sfce.util.upload;
import org.springframework.util.ClassUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Random;
/**
* @description:
* @author: zhucj
* @date: 2019-08-07 9:34
*/
public class FileUploadUtil {
/**
* 上传图片至项目中,保存位置 resources下(量少可以用,数量大不太建议使用)
* @param request
* @param file 文件内容
* @return 文件名字
*/
public static String saveFile(HttpServletRequest request,
MultipartFile file) {
// 判断文件是否为空
if (!file.isEmpty()) {
try {
//保存服务器,注意在Linux系统和Windows系统,文件分隔符不通用
String path = ClassUtils.getDefaultClassLoader().getResource("").getPath();
//此处自动根据系统,选择不同分隔符 /static/upload/fileName
String filePath = path + "static" + File.separator + "upload" + File.separator+file.getOriginalFilename();
File saveDir = new File(filePath);
if (!saveDir.getParentFile().exists()){
saveDir.getParentFile().mkdirs();
}
// 转存文件
file.transferTo(saveDir);
return file.getOriginalFilename();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
/**
* 上传文件到本地服务器磁盘
* @param fileName 上传文件路径名称
* E:/upload/img/12013212.jpg
* @param file
* @return
*/
public static String uploadFile(String fileName, MultipartFile file){
//项目中保存在本地服务时 fileName = 磁盘路径(注意区分系统) + 文件名称
File serverFile= new File(fileName);
try {
//判断文件是否已经存在
if (serverFile.exists()) {
throw new RuntimeException("文件已经存在");
}
//判断文件父目录是否存在
if (!serverFile.getParentFile().exists()) {
serverFile.getParentFile().mkdir();
}
//将上传的文件写入到服务器端文件内
file.transferTo(serverFile);
} catch (IOException e) {
e.printStackTrace();
return null;
}
return fileName;
}
/**
* 文件下载
* @param path 服务器文件地址
* @param response
* @return
*/
public static int downloadFile(String path, HttpServletResponse response) {
int result = 1;
InputStream is = null;
OutputStream os = null;
try {
File file = new File(path);
// 清空response
response.reset();
// 设置response的Header
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(file.getName(), "utf-8"));
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
is = new FileInputStream(file);
os = response.getOutputStream();
byte[] b = new byte[2048];
int length;
while ((length = is.read(b)) > 0) {
os.write(b, 0, length);
}
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
result = 0;
} finally {
closeInputStream(is);
closeOutputStream(os);
}
return result;
}
private static void closeInputStream(InputStream is) {
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void closeOutputStream(OutputStream os) {
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 生成随机文件名
*/
public static String genImageName() {
//取当前时间的长整形值包含毫秒
long millis = System.currentTimeMillis();
//加上三位随机数
Random random = new Random();
int end3 = random.nextInt(999);
//如果不足三位前面补0
String str = millis + String.format("%03d", end3);
return str;
}
}
项目中,我们如何访问上传到服务器磁盘上的图片了?一般本地只需要本地图片路径+图片名称即可在浏览器中访问。经常配置项目路径映射实现
package com.sf.vsolution.hb.sfce.config.interceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @description: 拦截器设置
* @author: zhucj
* @date: 2019-07-18 14:44
*/
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
@Value("${upload.upload-path}")
private String uploadPath;
/**
* 配置图片虚拟路径
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/upload/**").addResourceLocations("file:" + uploadPath);
}
}
注:配置完成后,所有localhost:8080/upload/1571292610115393.jpg 请求接口全部转成 file:E:/upload/img/1571292610115393.jpg .拦截器中配置的uploadPath地址,注意不同系统问题