SpringBoot实现单文件与多文件上传

网友投稿 263 2023-01-13

SpringBoot实现单文件与多文件上传

一、公共文件存储代码

1.FileUploadUtils.java

package com.springcloud.blog.admin.util.file;

/**

* @description: 文件上传工具类

* @author: youcong

* @time: 2020/9/28 11:34

*/

import com.springcloud.blog.admin.exception.file.FileNameLengthLimitExceededException;

import com.springcloud.blog.admin.exception.file.FileSizeLimitExceededException;

import com.springcloud.blog.admin.exception.file.InvalidExtensionException;

import com.springcloud.blog.admin.util.DateUtils;

import com.springcloud.blog.admin.util.IdUtils;

import com.springcloud.blog.admin.util.StringUtils;

import org.apache.commons.fileupload.FileUploadBase;

import org.apache.commons.io.FilenameUtils;

import org.springframework.web.multipart.MultipartFile;

import java.io.File;

import java.io.IOException;

public class FileUploadUtils {

/**

* 默认大小 50M

*/

public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;

/**

* 默认的文件名最大长度 100

*/

public static final int DEFAULT_FILE_NAME_LENGTH = 100;

/**

* 默认上传的地址

*/

private static String defaultBaseDir = "D://test//";

/**

* 资源映射路径 前缀

*/

public static String resource_prefix = "D://test//";

public static void setDefaultBaseDir(String defaultBaseDir) {

FileUploadUtils.defaultBaseDir = defaultBaseDir;

}

public static String getDefaultBaseDir() {

return defaultBaseDir;

}

/**

* 以默认配置进行文件上传

*

* @param file 上传的文件

* @return 文件名称

* @throws Exception

*/

public static final String upload(MultipartFile file) throws IOException {

try {

return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);

} catch (Exception e) {

throw new IOException(e.getMessage(), e);

}

}

/**

* 文件上传

*

* @param baseDir 相对应用的基目录

* @param file 上传的文件

* @param allowedExtension 上传文件类型

* @return 返回上传成功的文件名

* @throws FileSizeLimitExceededException 如果超出最大大小

* @throws FileNameLengthLimitExceededException 文件名太长

* @throws IOException 比如读写文件出错时

* @throws InvalidExtensionException 文件校验异常

*/

public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)

throws FileUploadBase.FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,

InvalidExtensionException {

int fileNamelength = file.getOriginalFilename().length();

if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) {

throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);

}

assertAllowed(file, allowedExtension);

String fileName = extractFilename(file);

File desc = getAbsoluteFile(baseDir, fileName);

file.transferTo(desc);

String pathFileName = getPathFileName(baseDir, fileName);

return pathFileName;

}

/**

* 编码文件名

*/

public static final String extractFilename(MultipartFile file) {

String fileName = file.getOriginalFilename();

String extension = getExtension(file);

fileName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;

return fileName;

}

private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException {

File desc = new File(uploadDir + File.separator + fileName);

if (!desc.getParentFile().exists()) {

desc.getParentFile().mkdirs();

}

if (!desc.exists()) {

desc.createNewFile();

}

return desc;

}

private static final String getPathFileName(String uploadDir, String fileName) throws IOException {

int dirLastIndex = defaultBaseDir.length() + 1;

String currentDir = StringUtils.substring(uploadDir, dirLastIndex);

String pathFileName = resource_prefix + "/" + currentDir + "/" + fileName;

return pathFileName;

}

/**

* 文件大小校验

*

* @param file 上传的文件

* @return

* @throws FileSizeLimitExceededException 如果超出最大大小

* @throws InvalidExtensionException

*/

public static final void assertAllowed(MultipartFile file, String[] allowedExtension)

throws FileSizeLimitExceededException, InvalidExtensionException {

long size = file.getSize();

if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE) {

throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);

}

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);

}

}

}

/**

* 判断MIME类型是否是允许的MIME类型

*

* @param extension

* @param allowedExtension

* @return

*/

public static final boolean isAllowedExtension(String extension, String[] allowedExtension) {

for (String str : allowedExtension) {

if (str.equalsIgnoreCase(extension)) {

return true;

}

}

return false;

}

/**

* 获取文件名的后缀

*

* @param file 表单文件

* @return 后缀名

*/

public static final String getExtension(MultipartFile file) {

String extension = FilenameUtils.getExtension(file.getOriginalFilename());

if (StringUtils.isEmpty(extension)) {

extension = MimeTypeUtils.getExtension(file.getContentType());

}

return extension;

}

}

2.FileUtils.java

package com.springcloud.blohttp://g.admin.util.file;

import javax.servlet.http.HttpServletRequest;

import java.io.*;

import java.net.URLEncoder;

/**

* 文件处理工具类

*

* @author youcong

*/

public class FileUtils extends org.apache.commons.io.FileUtils {

public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\|\\.\\u4e00-\\u9fa5]+";

/**

* 输出指定文件的byte数组

*

* @param filePath 文件路径

* @param os 输出流

* @return

*/

public static void writeBytes(String filePath, OutputStream os) throws IOException {

FileInputStream fis = null;

try {

File file = new File(filePath);

if (!file.exists()) {

throw new FileNotFoundException(filePath);

}

fis = new FileInputStream(file);

byte[] b = new byte[1024];

int length;

while ((length = fis.read(b)) > 0) {

os.write(b, 0, length);

}

} catch (IOException e) {

throw e;

} finally {

if (os != null) {

try {

os.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

if (fis != null) {

try {

fis.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

}

}

/**

* 删除文件

*

* @param filePath 文件

* @return

*/

public static boolean deleteFile(String filePath) {

boolean flag = false;

File file = new File(filePath);

// 路径为文件且不为空则进行删除

if (file.isFile() && file.exists()) {

file.delete();

flag = true;

}

return flag;

}

/**

* 文件名称验证

*

* @param filename 文件名称

* @return true 正常 false 非法

*/

public static boolean isValidFilename(String filename) {

return filename.matches(FILENAME_PATTERN);

}

/**

* 下载文件名重新编码

*

* @param request 请求对象

* @param fileName 文件名

* @return 编码后的文件名

*/

public static String setFileDownloadHeader(HttpServletRequest request, String fileName)

throws UnsupportedEncodingException {

final String agent = request.getHeader("USER-AGENT");

String filename = fileName;

if (agent.contains("MSIE")) {

// IE浏览器

filename = URLEncoder.encode(filename, "utf-8");

filename = filename.replace("+", " ");

} else if (agent.contains("Firefox")) {

// 火狐浏览器

filename = new String(fileName.getBytes(), "ISO8859-1");

} else if (agent.contains("Chrome")) {

// google浏览器

filename = URLEncoder.encode(filename, "utf-8");

} else {

// 其它浏览器

filename = URLEncoder.encode(filename, "utf-8");

}

return filename;

}

}

3.MimeTypeUtils.java

package com.springcloud.blog.admin.util.file;

/**

* @description:

* @author: youcong

* @time: 2020/9/28 11:37

*/

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:

rhttp://eturn "gif";

default:

return "";

}

}

}

4.FileException.java

package com.springcloud.blog.admin.exception.file;

import com.springcloud.blog.admin.exception.BaseException;

/**

* @description: 文件信息异常类

* @author: youcong

* @time: 2020/9/28 11:41

*/

public class FileException extends BaseException {

private static final long serialVersionUID = 1L;

public FileException(String code, Object[] args) {

super("file", code, args, null);

}

}

5.FileNameLengthLimitExceededException.java

package com.springcloud.blog.admin.exception.file;

/**

* @description:文件名称超长限制异常类

* @author: youcong

* @time: 2020/9/28 11:41

*/

public class FileNameLengthLimitExceededException extends FileException {

private static final long serialVersionUID = 1L;

public FileNameLengthLimitExceededException(int defaultFileNameLength) {

super("upload.filename.exceed.length", new Object[]{defaultFileNameLength});

}

}

6.FileSizeLimitExceededException.java

package com.springcloud.blog.admin.exception.file;

/**

* @description: 文件名大小限制异常类

* @author: youcong

* @time: 2020/9/28 11:42

*/

public class FileSizeLimitExceededException extends FileException {

private static final long serialVersionUID = 1L;

public FileSizeLimitExceededException(long defaultMaxSize) {

super("upload.exceed.maxSize", new Object[]{defaultMaxSize});

}

}

7.InvalidExtensionException.java

package com.springcloud.blog.admin.exception.file;

/**

* @description: 文件上传错误异常类

* @author: youcong

* @time: 2020/9/28 11:42

*/

import org.apache.commons.fileupload.FileUploadException;

import java.util.Arrays;

public class InvalidExtensionException extends FileUploadException {

private static final long serialVersionUID = 1L;

private String[] allowedExtension;

private String extension;

private String filename;

public InvalidExtensionException(String[] allowedExtension, String extension, String filename) {

super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]");

this.allowedExtension = allowedExtension;

this.extension = extension;

this.filename = filename;

}

public String[] getAllowedExtension() {

return allowedExtension;

}

public String getExtension() {

return extension;

}

public String getFilename() {

return filename;

}

public static class InvalidImageExtensionException extends InvalidExtensionException {

private static final long serialVersionUID = 1L;

public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) {

super(allowedExtension, extension, filename);

}

}

public static class InvalidFlashExtensionException extends InvalidExtensionException {

private static final long serialVersionUID = 1L;

public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) {

super(allowedExtension, extension, filename);

}

}

public static class InvalidMediaExtensionException extends InvalidExtensionException {

private static final long serialVersionUID = 1L;

public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) {

super(allowedExtension, extension, filename);

}

}

public static class InvalidVideoExtensionException extends InvalidExtensionException {

private static final long serialVersionUID = 1L;

public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) {

super(allowedExtension, extension, filename);

}

}

}

8.BaseException.java

package com.springcloud.blog.admin.exception;

/**

* 基础异常

*

* @author youcong

*/

public class BaseException extends RuntimeException {

private static final long serialVersionUID = 1L;

/**

* 所属模块

*/

private String module;

/**

* 错误码

*/

private String code;

/**

* 错误码对应的参数

*/

private Object[] args;

/**

* 错误消息

*/

private String defaultMessage;

public BaseException(String module, String code, Object[] args, String defaultMessage) {

this.module = module;

this.code = code;

this.args = args;

this.defaultMessage = defaultMessage;

}

public BaseException(String module, String code, Object[] args) {

this(module, code, args, null);

}

public BaseException(String module, String defaultMessage) {

this(module, null, null, defaultMessage);

}

public BaseException(String code, Object[] args) {

this(null, code, args, null);

}

public BaseException(String defaultMessage) {

this(null, null, null, defaultMessage);

}

public String getModule() {

return module;

}

public String getCode() {

return code;

}

public Object[] getArgs() {

return args;

}

public String getDefaultMessage() {

return defaultMessage;

}

}

二、单文件上传代码

@PostMapping("/post/uploadFile")

@ApiOperation("文章上传特色图片")

public ResponseBaseDTO uploadFile(@RequestParam("file") MultipartFile file) {

logger.info("/post/uploadFile");

try {

String fileUrl = FileUploadUtils.upload(file);

if (fileUrl != null) {

return ResponseBaseDTO.createSuccResp(fileUrl);

}

return ResponseBaseDTO.createFailResp(fileUrl);

} catch (Exception e) {

logger.error("/post/uploadFile", e);

return ResponseBaseDTO.createFailResp(e.getMessage());

}

}

三、多文件上传代码

@PostMapping("/batchImportsUsers")

@ApiOperation("批量导入用户数据小时")

public ResponseBaseDTO batchImportsUsers(MultipartFile[] uploadFiles) {

if (uploadFiles.length > 0) {

for (int i = 0; i < uploadFiles.length; i++) {

try {

importUserExcelData(uploadFiles[i]);

} catch (Exception e) {

e.printStackTrace();

}

}

return ResponseBaseDTO.createSuccResp();

}

return ResponseBaseDTO.createFailResp(e.getMessage());

}

以上就是SpringBoot实现单文件与多文件上传的详细内容,更多关于SpringBoot文件上传的资料请关注我们其它相关文章!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于OAuth2.0授权系统的验证码功能的实现
下一篇:使用IDEA搭建MyBatis环境详细过程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~