SpringBoot项目实现上传

编程入门 行业动态 更新时间:2024-10-07 04:31:05

SpringBoot项目实现<a href=https://www.elefans.com/category/jswz/34/1771255.html style=上传"/>

SpringBoot项目实现上传

相关配置

# 文件路径 profile: C:\\Users\\ASUS\\code\\uploadPath\\

Controller
返回类型只要是以json格式均可

@RestController
@RequestMapping("/admin/common")
public class CommonController {@Autowiredprivate ServerConfig serverConfig;/*** 通用上传请求*/@PostMapping("/upload")public ResultJson uploadFile(MultipartFile file) throws Exception {try {// 上传文件路径   读取对应配置文件中的profileString filePath = NiuaConfig.getUploadPath();// 上传并返回新文件名称String fileName = FileUploadUtils.upload(filePath, file);String url = serverConfig.getUrl() + fileName;Map<String, String> prams = new HashMap<String, String>();prams.put("fileName", fileName);//上传到服务器中的地址prams.put("url", url);return ResultJson.ok(prams);} catch (Exception e) {return ResultJson.failure(ResultCode.BAD_REQUEST, e.getMessage());}}}

其中

NiuaConfig.getUploadPath();

是通过yml文件读取上传目标地址的函数
NiuaConfig

@Component
@ConfigurationProperties(prefix = "niua")
public class NiuaConfig {/** 项目名称 */private String name;/** 版本 */private String version;/** 版权年份 */private String copyrightYear;/** 实例演示开关 */private boolean demoEnabled;/** 上传路径 */private static String profile;/** 获取地址开关 */private static boolean addressEnabled;/*** 获取上传路径*/public static String getUploadPath(){return getProfile() + "upload";}public static String getProfile(){return profile;}
}

FileUploadUtils中封装的是与上传条件、上传方式相关的内容
在执行

FileUploadUtils.upload(filePath, file);

这段代码时
会调用FileUploadUtils中按照上传路径上传的upload方法

/*** 根据文件路径上传** @param baseDir 相对应用的基目录* @param file 上传的文件* @return 文件名称* @throws IOException*/public static final String upload(String baseDir, MultipartFile file) throws IOException{try{return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);}catch (Exception e){throw new IOException(e.getMessage(), e);}}

接着将信息传入真正的upload方法中,其中MimeTypeUtils是封装了上传文件格式限制的一个类
MimeTypeUtils

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" ,"mp4"};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",// pdf"pdf",//视频"mp4"};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 "";}}
}
/*** 文件上传** @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 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;}

通过MultipartFile这个类中的方法获取获取文件名与文件名的长度,如果文件名的长度超出规定值则抛出异常
如果通过检测则调用assertAllowed方法检验文件大小是否符合要求,不符合要求则抛出异常,符合要求则获
取文件名以及后缀,通过遍历比较后缀与允许的格式,如果均不匹配且被允许的后缀不为空再根据特定类型判断
并抛出对应的异常

/*** 文件大小校验** @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{throw new InvalidExtensionException(allowedExtension, extension, fileName);}}}

当这些检验都没问题后,将文件名按日期的形式转码,保证文件的不重复性

 /*** 编码文件名*/public static final String extractFilename(MultipartFile file){String fileName = file.getOriginalFilename();String extension = getExtension(file);fileName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;return fileName;}

随后建立文件夹或者存储在已有的文件夹中
例如2022-7-10上传
xxx\2022\7\10\编码后的文件名.后缀

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

最后Constants是一个常量池

public class Constants {/*** UTF-8 字符集*/public static final String UTF8 = "UTF-8";/*** GBK 字符集*/public static final String GBK = "GBK";/*** http请求*/public static final String HTTP = "http://";/*** https请求*/public static final String HTTPS = "https://";/*** 通用成功标识*/public static final String SUCCESS = "0";/*** 通用失败标识*/public static final String FAIL = "1";/*** 登录成功*/public static final String LOGIN_SUCCESS = "Success";/*** 注销*/public static final String LOGOUT = "Logout";/*** 登录失败*/public static final String LOGIN_FAIL = "Error";/*** 验证码 redis key*/public static final String CAPTCHA_CODE_KEY = "captcha_codes:";/*** 登录用户 redis key*/public static final String LOGIN_TOKEN_KEY = "login_tokens:";/*** 防重提交 redis key*/public static final String REPEAT_SUBMIT_KEY = "repeat_submit:";/*** 验证码有效期(分钟)*/public static final Integer CAPTCHA_EXPIRATION = 2;/*** 令牌*/public static final String TOKEN = "token";/*** 令牌前缀*/public static final String TOKEN_PREFIX = "Bearer ";/*** 令牌前缀*/public static final String LOGIN_USER_KEY = "login_user_key";/*** 用户ID*/public static final String JWT_USERID = "userid";/*** 用户名称*/public static final String JWT_USERNAME = "sub";/*** 用户头像*/public static final String JWT_AVATAR = "avatar";/*** 创建时间*/public static final String JWT_CREATED = "created";/*** 用户权限*/public static final String JWT_AUTHORITIES = "authorities";/*** 参数管理 cache key*/public static final String SYS_CONFIG_KEY = "sys_config:";/*** 字典管理 cache key*/public static final String SYS_DICT_KEY = "sys_dict:";/*** 资源映射路径 前缀*/public static final String RESOURCE_PREFIX = "/profile";
}

FileUploadUtils

public class FileUploadUtils {/*** 默认大小 50M*/public static final long DEFAULT_MAX_SIZE = 5120 * 1024 * 1024;/*** 默认的文件名最大长度 100*/public static final int DEFAULT_FILE_NAME_LENGTH = 100;/*** 默认上传的地址*/private static String defaultBaseDir = NiuaConfig.getProfile();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 上传的文件* @return 文件名称* @throws IOException*/public static final String upload(String baseDir, MultipartFile file) throws IOException{try{return upload(baseDir, 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 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 = NiuaConfig.getProfile().length();String currentDir = StringUtils.substring(uploadDir, dirLastIndex);String pathFileName = Constants.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{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;}
}

ServerConfig

@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();}
}

VUE前端Upload组件

<template><div class="component-upload-image"><el-uploaddrag:action="uploadImgUrl":on-success="handleUploadSuccess":before-upload="handleBeforeUpload":on-error="handleUploadError"name="file":show-file-list="false":headers="headers"><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div></el-upload></div>
</template><script>
import {getToken} from '@/utils/auth';export default {name:"Upload",data() {return {headers: {Authorization: "Bearer " + getToken(),},uploadUrlPath: "没有文件上传",};},props: {uploadImgUrl: {type: String,default: "/v1/admin/common/upload",}},methods: {handleUploadSuccess(res) {this.uploadUrlPath = JSON.stringify(res);this.loading.close();this.$emit('upload-event',this.uploadUrlPath)},handleBeforeUpload() {this.loading = this.$loading({lock: true,text: "上传中",background: "rgba(0, 0, 0, 0.7)",});},handleUploadError() {this.$message({type: "error",message: "上传失败",});this.loading.close();},},watch: {},
};
</script>

调用

<template><div class="component-upload-image"><el-uploaddrag:action="uploadImgUrl":on-success="handleUploadSuccess":before-upload="handleBeforeUpload":on-error="handleUploadError"name="file":show-file-list="false":headers="headers"><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div></el-upload><el-row><span>{{uploadUrlPath}}</span></el-row></div>
</template><script>import { getToken } from '@/utils/auth';export default {components: {},data() {return {uploadImgUrl:  "/v1/admin/common/upload", // 上传的图片服务器地址headers: {Authorization: "Bearer " + getToken(),},uploadUrlPath: "没有文件上传",};},props: {value: {type: String,default: "",},},methods: {handleUploadSuccess(res) {this.uploadUrlPath = JSON.stringify(res);this.loading.close();},handleBeforeUpload() {this.loading = this.$loading({lock: true,text: "上传中",background: "rgba(0, 0, 0, 0.7)",});},handleUploadError() {this.$message({type: "error",message: "上传失败",});this.loading.close();},},watch: {},};
</script><style scoped lang="scss">.avatar {width: 100%;height: 100%;}
</style>

查看结果

更多推荐

SpringBoot项目实现上传

本文发布于:2024-03-23 15:25:36,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1739755.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:上传   项目   SpringBoot

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!