1.准备配置类
package com.ruoyi.screen.core;
public class MimeTypeUtils
{
public static final String IMAGE_PNG = "image/png";
public static final String IMAGE_JPG = "image/jpg";
public static final String IMAGE_JPEG = "image/jpeg";
public static final String IMAGE_BMP = "image/bmp";
public static final String IMAGE_GIF = "image/gif";
public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" };
public static final String[] FLASH_EXTENSION = { "swf", "flv" };
public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg",
"asf", "rm", "rmvb" };
public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" };
public static final String[] DEFAULT_ALLOWED_EXTENSION = {
// 图片
"bmp", "gif", "jpg", "jpeg", "png",
// word excel powerpoint
"doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt",
// 压缩文件
"rar", "zip", "gz", "bz2",
// 视频格式
"mp4", "avi", "rmvb",
// pdf
"pdf" };
public static String getExtension(String prefix)
{
switch (prefix)
{
case IMAGE_PNG:
return "png";
case IMAGE_JPG:
return "jpg";
case IMAGE_JPEG:
return "jpeg";
case IMAGE_BMP:
return "bmp";
case IMAGE_GIF:
return "gif";
default:
return "";
}
}
}
2工具类配置
1.获取上传文件后的url配置
@Component
public class ServerConfig
{
/**
* 获取完整的请求路径,包括:域名,端口,上下文访问路径
*
* @return 服务地址
*/
public String getUrl()
{
HttpServletRequest request = ServletUtils.getRequest();
return getDomain(request);
}
public static String getDomain(HttpServletRequest request)
{
StringBuffer url = request.getRequestURL();
String contextPath = request.getServletContext().getContextPath();
return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString();
}
}
2.service配置
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.ruoyi.screen.core;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.exception.file.FileNameLengthLimitExceededException;
import com.ruoyi.common.exception.file.FileSizeLimitExceededException;
import com.ruoyi.common.exception.file.InvalidExtensionException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;
import java.security.spec.KeySpec;
import java.util.Base64;
import java.util.Objects;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;
public class FileUploadUtils {
public static final long DEFAULT_MAX_SIZE = 52428800L;
public static final int DEFAULT_FILE_NAME_LENGTH = 100;
private static String defaultBaseDir = RuoYiConfig.getProfile();
private static final String SECRET_KEY = "MySecretKey1234";
public FileUploadUtils() {
}
public static void setDefaultBaseDir(String defaultBaseDir) {
FileUploadUtils.defaultBaseDir = defaultBaseDir;
}
public static String getDefaultBaseDir() {
return defaultBaseDir;
}
private static SecretKey generateSecretKey() throws Exception {
KeySpec keySpec = new PBEKeySpec("MySecretKey1234".toCharArray(), "MySecretKey1234".getBytes(), 128, 256);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] secretKeyBytes = secretKeyFactory.generateSecret(keySpec).getEncoded();
return new SecretKeySpec(secretKeyBytes, "AES");
}
public static final String upload(MultipartFile file) throws IOException {
try {
return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
} catch (Exception var2) {
throw new IOException(var2.getMessage(), var2);
}
}
public static final String upload(String baseDir, MultipartFile file) throws IOException {
try {
return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
} catch (Exception var3) {
throw new IOException(var3.getMessage(), var3);
}
}
public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) throws Exception {
int fileNamelength = ((String)Objects.requireNonNull(file.getOriginalFilename())).length();
if (fileNamelength > 100) {
throw new FileNameLengthLimitExceededException(100);
} else {
assertAllowed(file, allowedExtension);
String fileName = extractFilename(file);
//String fileName = "shebei.xlsx";
String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
file.transferTo(Paths.get(absPath));
return getPathFileName(baseDir, fileName);
}
}
public static final String extractFilename(MultipartFile file) throws Exception {
String uniqueIdentifier = generateUniqueIdentifier();
return StringUtils.format("{}/{}_{}", new Object[]{DateUtils.datePath(), encodeBase64Url(file.getOriginalFilename()), uniqueIdentifier});
}
private static String generateUniqueIdentifier() {
return String.valueOf(System.currentTimeMillis());
}
public static String encodeBase64Url(String input) {
byte[] encodedBytes = Base64.getUrlEncoder().encode(input.getBytes(StandardCharsets.UTF_8));
return new String(encodedBytes, StandardCharsets.UTF_8);
}
public static String decodeBase64Url(String input) {
byte[] decodedBytes = Base64.getUrlDecoder().decode(input.getBytes(StandardCharsets.UTF_8));
return new String(decodedBytes, StandardCharsets.UTF_8);
}
public static String encryptFileName(String fileName) throws Exception {
SecretKey secretKey = generateSecretKey();
Cipher cipher = Cipher.getInstance("AES");
cipher.init(1, secretKey);
byte[] encryptedBytes = cipher.doFinal(fileName.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static String decryptFileName(String encryptedFileName) throws Exception {
SecretKey secretKey = generateSecretKey();
Cipher cipher = Cipher.getInstance("AES");
cipher.init(2, secretKey);
byte[] decodedBytes = Base64.getDecoder().decode(encryptedFileName);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
return new String(decryptedBytes);
}
public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException {
File desc = new File(uploadDir + File.separator + fileName);
if (!desc.exists() && !desc.getParentFile().exists()) {
desc.getParentFile().mkdirs();
}
return desc;
}
public static final String getPathFileName(String uploadDir, String fileName) throws IOException {
int dirLastIndex = RuoYiConfig.getProfile().length() + 1;
String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
return "/profile/" + currentDir + "/" + fileName;
}
public static final void assertAllowed(MultipartFile file, String[] allowedExtension) throws FileSizeLimitExceededException, InvalidExtensionException {
long size = file.getSize();
if (size > 52428800L) {
throw new FileSizeLimitExceededException(50L);
} else {
String fileName = file.getOriginalFilename();
String extension = getExtension(file);
if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) {
if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) {
throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, fileName);
} else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) {
throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, fileName);
} else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) {
throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, fileName);
} else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) {
throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, fileName);
} else {
throw new InvalidExtensionException(allowedExtension, extension, fileName);
}
}
}
}
public static final boolean isAllowedExtension(String extension, String[] allowedExtension) {
String[] var2 = allowedExtension;
int var3 = allowedExtension.length;
for(int var4 = 0; var4 < var3; ++var4) {
String str = var2[var4];
if (str.equalsIgnoreCase(extension)) {
return true;
}
}
return false;
}
public static final String getExtension(MultipartFile file) {
String extension = FilenameUtils.getExtension(file.getOriginalFilename());
if (StringUtils.isEmpty(extension)) {
extension = MimeTypeUtils.getExtension((String)Objects.requireNonNull(file.getContentType()));
}
return extension;
}
}
3.调用上传
public String insertKnowledgeDocumentsFiles(List<MultipartFile> file) {
try
{ // 上传文件路径
String filePath =profile+"/xlsx";
LoggerHelper.info("文件上传路径:"+profile);
// 上传并返回新文件名称
if (file != null && !file.isEmpty()) {
for (MultipartFile file1 : file) {
String fileName = FileUploadUtils.upload(filePath, file1);
String url = serverConfig.getUrl() + fileName;
String newFileName = FileUtils.getName(fileName) ;
String originalFilename = file1.getOriginalFilename() ;
System.out.println(fileName);
System.out.println(url);
System.out.println(newFileName);
System.out.println(originalFilename);
}
}
return "ok";
}
catch (Exception e)
{
LoggerHelper.error(e.getMessage());
return "FilesUploadError";
}
}
4.文件下载使用
@GetMapping("/download/resource") public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) throws Exception { try { if (!FileUtils.checkAllowDownload(resource)) { throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource)); } // 本地资源路径 String localPath = RuoYiConfig.getProfile(); // 数据库资源地址 String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); // 下载名称 String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); FileUtils.setAttachmentResponseHeader(response, downloadName); FileUtils.writeBytes(downloadPath, response.getOutputStream()); } catch (Exception e) { log.error("下载文件失败", e); } }