框架的上传实现的学习记录"/>
niua框架的上传实现的学习记录
前言
简述niua框架的上传功能的实现
- niua框架的上传接口介绍
- 前端组件调用接口并实现上传操作
niua框架的上传接口
niua框架是基于mybatis-plus搭建的一个轻量级框架,集合了上传以及代码生成等功能
上传接口定义在在niua框架的common中,文件树结构如下,controller层中定义了接口方法[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
接口代码
@PostMapping("/upload")public ResultJson uploadFile(MultipartFile file) throws Exception {try {// 上传文件路径String 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());}}
1.获取本地文件上传路径
String filePath = NiuaConfig.getUploadPath();
上传路径变量在配置实体类中,而实际的赋值,在admin–>resources–>application-local.yml 本地配置文件中。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
2.上传文件并返回新的文件名称
String fileName = FileUploadUtils.upload(filePath, file);
调用FileUploadUtils的上传方法,进行文件名称长度判断,大小检验以及重新命名并返回文件名
封装的上传方法
/*** 根据文件路径上传** @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方法
/*** 文件上传** @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;}
int fileNamelength = file.getOriginalFilename().length();if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH){throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);}
进行上传文件的文件名称检验,是否小于预定的大小
assertAllowed(file, allowedExtension);//方法的源码如下/*** 文件大小校验** @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);}}}
进行文件大小的检验
String fileName = extractFilename(file);//extractFilename 源码/*** 编码文件名*/public static final String extractFilename(MultipartFile file){String fileName = file.getOriginalFilename();String extension = getExtension(file);fileName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;return fileName;}
编辑文件名,根据时间在本地上传目录下创建文件夹,并随机生成ID加后缀为上传文件的名。
File desc = getAbsoluteFile(baseDir, fileName);// getAbsoluteFile方法/**** @param uploadDir 上传的文件父级目录* @param fileName 重新编码后上传的文件名* @return* @throws IOException*/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;}
判断文件上级目录是否存在,如果存在则直接在此下创建文件,若父级目录不存在则先创建父级目录再创建文件
file.transferTo(desc);
直接写入文件
String pathFileName = getPathFileName(baseDir, fileName);//getPathFileName方法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;}
获得文件的存储路径
拼接url并以JSON格式返回 fileName以及url
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);
上传组件调用接口
<el-upload drag:action="uploadImgUrl":on-success="handleUploadSuccess" # 上传成功后触发的事件:before-upload="handleBeforeUpload" # 上传前触发的事件,通常是进行文件限制:on-error="handleUploadError" # 上传失败触发的事件name="file":show-file-list="false":headers="headers" # niua框架的请求头,>
借用了element ui 的组件,将上面的接口调用url赋值给uploadImgUrl
uploadImgUrl:{type:String,default: "/v1/admin/common/upload", // 上传的图片服务器地址}
headers的获取
headers: {Authorization: "Bearer " + getToken(),},
总结
ImgUrl
uploadImgUrl:{type:String,default: "/v1/admin/common/upload", // 上传的图片服务器地址}
headers的获取
headers: {Authorization: "Bearer " + getToken(),},
总结
本文,记录了我在学习element ui组件实现上传时涉及到的niua框架的一些上传功能基础。讲述了如何调用niua框架的上传接口,以及上传接口是如何实现的。希望有所帮助。
更多推荐
niua框架的上传实现的学习记录
发布评论