1.文件上传
jsp页面
controller
@RequestMapping("/upload")
public String uploadFile(@RequestParam MultipartFile[] files,HttpSession session)throws UploadExeception {
//获取session中UserInfo对象
UserInfo user = (UserInfo) session.getAttribute("user");
//获取用户名
String username = user.getUserName();
//定义集合对象存储文件信息
List<FileInfo> fileInfols = new ArrayList<FileInfo>();
for (MultipartFile file : files) {
//获取上传文件的大小(单位:字节)
long size = file.getSize();
//获取上传文件的文件名
String fileName =file.getOriginalFilename();
/*
* 生成uuid,使用md5加密,作为文件提取秘钥
*/
UUID uuid = UUID.randomUUID();
String fileCode = MD5Utils.createMD5(uuid.toString());
//文件存储路径
String filePath = username + "/" + uuid+ fileName.substring(fileName.indexOf("."));
//把文件信息封装到对象中
FileInfo fileInfo = new FileInfo(fileName, size, fileCode, filePath, user.getUserId());
//添加到集合中
fileInfols.add(fileInfo);
}
//上传文件的文件夹目录
String fileDir = session.getServletContext().getRealPath("/upload");
//用户文件夹目录
String userDir=fileDir+"/"+username;
//调用service进行业务逻辑的判断并把文件信息添加到数据库中
fileInfoService.upload(fileInfols, userDir, user.getUserType());
//创建集合对象存储文件对象
List<File> FileList = new ArrayList<File>();
for (FileInfo fileInfo : fileInfols) {
FileList.add(new File(fileDir, fileInfo.getFilePath()));
}
int index=0;
for (MultipartFile file : files) {
try {
//进行文件的上传
file.transferTo(FileList.get(index++));
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return "redirect:/user/fileInfo";
}
service
public void upload(List<FileInfo> fileInfols, String userDir, int userType)
throws UploadExeception {
// 记录上传文件的总大小
long fileTotalSize = 0;
// 记录上传目录下文件的总大小
long dirFileSize = 0;
/*
* 获取服务器下用户目录已上传的文件所占的空间大小
*/
File dir = new File(userDir);
if (dir.exists()) {
if (dir.isDirectory()) {
File[] listFiles = dir.listFiles();
for (File file : listFiles) {
dirFileSize += file.length();
}
}
}
for (FileInfo fileInfo : fileInfols) {
long fileSize = fileInfo.getFileSize();
/*
* 判断普通会员
*/
if (userType == 1) {
if (fileSize > 1024 * 1024) {
throw new UploadExeception("文件大小不能超过1M");
}
// 普通会员剩余空间
long commonSurplusSize = 32 * 1024 * 1024 - dirFileSize;
// 判断普通会员剩余空间是否足够
if (commonSurplusSize < fileSize ) {
throw new UploadExeception("可用空间不足");
}
/*
* 判断vip会员
*/
} else if (userType == 2) {
if (fileSize > 1024 * 2 * 1024) {
throw new UploadExeception("文件大小不能超过2M");
}
// 计算总上传的文件大小
fileTotalSize += fileSize;
}
}
// vip会员剩余空间
long vipSurplusSize = 128 * 1024 * 1024 - dirFileSize;
// 判断vip会员剩余空间是否足够
if (vipSurplusSize <fileTotalSize ) {
throw new UploadExeception("可用空间不足");
}
//进行遍历,调用mapper层,把文件信息添加到数据库中
for (FileInfo file : fileInfols) {
fileInfoMapper.addFileInfo(file);
}
}
自定义异常解析器(实现HandlerExceptionResolver接口):
springmvc.xml中的配置(注意:id值固定为handlerExceptionResolver)
<bean id="handlerExceptionResolver" class="com.exeception.UploadExecetionHandle"></bean>
MD5工具类:
public class MD5Utils {
/**
* 对字符串进行加密
* @param str
* @return
*/
public static String createMD5(String str){
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
//将字符串转换为字节数组
byte[] oldBytes= str.getBytes("iso-8859-1");
//对字节数组进行加密
byte[] md5Bytes = messageDigest.digest(oldBytes);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
byte b = md5Bytes[i];
int val = ((int)b)&0xff;//与一个16进制的数值进行与运算
if(val<10){
sb.append(0);
}
sb.append(Integer.toHexString(val));//转换为16进制
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
}
2.文件的下载
@RequestMapping("/downLoad")
public ResponseEntity<byte[]> download( String fileCode,
HttpSession session) throws IOException {
FileInfo fileInfo = fileInfoService.getFileInfoByFileCode(fileCode);
String uploadDir = session.getServletContext().getRealPath("/upload");
File file = new File(uploadDir, fileInfo.getFilePath());
String filename = fileInfo.getFileName();
filename = new String(filename.getBytes("utf-8"),"ISO-8859-1");
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentDispositionFormData("attachment", filename);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), httpHeaders, HttpStatus.OK);
}