1 注意事项
1.1 传文件在服务器端保存位置问题
1.保存在可以被浏览器直接访问的位置
例如:商城的商品图片
保存在工程的WebRoot下的路径(不包含META-INF以及WEB-INF目录及其子目录)
2.保存在不能被浏览器直接访问的位置
例如:付费的视频。
1.工程中 META-INF WEB-INF目录及其子目录
2.不在工程中的服务器的磁盘目录下.
1.1 上传文件在同一个目录重名问题
在开发中解决这个问题,可以给上传文件起随机名称。
1.使用毫秒值
2.使用uuid
1.2 同一目录下文件过多
只需要分目录就可以.
1.按照上传时间进行目录分离 (周、月 )
2.按照上传用户进行目录分离 ----- 为每个用户建立单独目录
3.按照固定数量进行目录分离 ------ 假设每个目录只能存放3000个文件 ,每当一个目录存满3000个文件后,创建一个新的目录
4.按照文件名的hashcode进行目录分离.
2 hashcode工具类
package com.lan.common.utils;
import java.io.File;
import java.util.UUID;
public class FileUploadUtils {
// 得到上传文件真实名称 c:\a.txt a.txt
public static String getRealName(String filename) {
int index= filename.lastIndexOf("\\") + 1;
return filename.substring(index);
}
// 获取随机名称 a.txt
public static String getUUIDFileName(String filename) {
int index= filename.lastIndexOf(".");
if (index!= -1) {
return UUID.randomUUID()+ filename.substring(index);
} else {
return UUID.randomUUID().toString();
}
}
// 目录分离算法
public static String getRandomDirectory(String filename) {
/* 方法一
*
* int hashcode =filename.hashCode();
// int类型数据在内存中占32位。转换成16进制数,就得到8个16进制数
String hex =Integer.toHexString(hashcode);
return "/" +hex.charAt(0) + "/" + hex.charAt(1);*/
int hashcode = filename.hashCode();
System.out.println(Integer.toBinaryString(hashcode));
int a =hashcode & 0xf;
hashcode = hashcode >>> 4;
int b =hashcode & 0xf;
return "/" + a + "/" + b;
}
}
3 springmvc实例
/**
* 文件上传
*/
@PostMapping(value = "/project/upload")
@ResponseBody
public BaseResultVo uploadFile(HttpServletRequest request) {
BaseResultVo brv = new BaseResultVo();
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
//获得非上传组件
// String tableId = multipartRequest.getParameter("tableId");
//获得上传组件
List<MultipartFile> fileList = multipartRequest.getFiles("file");
MultipartFile myfile = fileList.get(0);//获得第一个上传文件
try {
String originalFilename = myfile.getOriginalFilename();//获得上传文件名.后缀
String pathTemp = request.getServletContext().getRealPath("/temp/");
String pathNameTemp = pathTemp + originalFilename; //临时完整目录文件名.后缀
// 得到上传文件名称
String filename = FileUploadUtils.getRealName(originalFilename);
// 得到随机名称.后缀
String uuidname = FileUploadUtils.getUUIDFileName(filename);
// 得到随机目录
String randomDirectory = FileUploadUtils.getRandomDirectory(filename);
// 注意:随机目录可能不存在,需要创建.
File rd = new File(pathTemp, randomDirectory);
if (!rd.exists()) {
rd.mkdirs();
}
System.out.println(rd);
//先把传过来的文件放在临时文件夹下,然后从文件夹中取出
InputStream inputStream = myfile.getInputStream();
IOUtils.copy(inputStream, new FileOutputStream(new File(rd, uuidname)));
//删除临时文件
// File fileTemp = new File(pathNameTemp);
// if(fileTemp.exists() && fileTemp.isFile()) {
// fileTemp.delete();
// }
brv.setResultMsg("0000", "成功");
brv.setData("/temp" + randomDirectory + "/" + uuidname);
return brv;
} catch (Exception e) {
e.printStackTrace();
brv.setResultMsg("9999", "失败");
return brv;
}
}