当我们没有搭建单独的文件服务器时,我们需要将文件上传至项目目录下,今天我们就学习如何上传文件到项目的resources目录下
一、引入依赖
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.3</version></dependency>
文件上传,就会涉及到 IO 操作,我们需要引入以上依赖
二、配置文件
spring:
# 上传文件
servlet:
multipart:
max-file-size:10MB
max-request-size:10MB
配置上传文件的最大值:
- spring.servlet.multipart.max-file-size,限制单个文件的最大值
- spring.servlet.multipart.max-request-size,限制上传的多个文件的总大小
三、上传工具类
packagecom.asurplus.common.utils;importorg.apache.commons.lang3.StringUtils;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Component;importorg.springframework.util.ResourceUtils;importorg.springframework.web.multipart.MultipartFile;importjava.io.File;importjava.net.InetAddress;importjava.util.UUID;/**
* 文件上传
*
* @author YangXiuTeng
* @date Jun 1, 2015
*/@ComponentpublicclassUploadFileUtil{/**
* 项目端口
*/@Value("${server.port}")publicString port;/**
* 项目路径
*/@Value("${server.servlet.context-path}")publicString contextPath;/**
* 上传文件
*
* @param multipartFile 文件对象
* @param dir 上传目录
* @return
*/publicResponseResultuploadFile(MultipartFile multipartFile,String dir){try{if(multipartFile.isEmpty()){returnResponseResult.error("请选择文件");}// 获取文件的名称String originalFilename = multipartFile.getOriginalFilename();// 文件后缀 例如:.pngString fileSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));// uuid 生成文件名String uuid =String.valueOf(UUID.randomUUID());// 根路径,在 resources/static/uploadString basePath =ResourceUtils.getURL("classpath:").getPath()+"static/upload/"+(StringUtils.isNotBlank(dir)?(dir +"/"):"");// 新的文件名,使用uuid生成文件名String fileName = uuid + fileSuffix;// 创建新的文件File fileExist =newFile(basePath);// 文件夹不存在,则新建if(!fileExist.exists()){
fileExist.mkdirs();}// 获取文件对象File file =newFile(basePath, fileName);// 完成文件的上传
multipartFile.transferTo(file);// 返回绝对路径returnResponseResult.success("上传成功","http://"+InetAddress.getLocalHost().getHostAddress()+":"+ port + contextPath +"/upload/"+ fileName);}catch(Exception e){
e.printStackTrace();}returnResponseResult.error("上传失败");}}
- 我们由于需要在工具类中获取项目端口及上下文路径,所以我们使用注解 @Component
- 我们上传的根目录在:resources/static/upload
- 文件名,我们使用了 uuid 作为新的文件名,保证文件不会被覆盖
- 我们返回的路径是绝对路径,在实际的生成环境中,建议使用相对路径
- ResponseResult 是我们自定义的统一返回对象,表示成功还是失败
四、上传调用
- 1、注入上传工具类
@AutowiredprivateUploadFileUtil uploadFileUtil;
- 2、上传 API
/**
* 上传文件
* <p>
* Ajax方式上传文件
*
* @return
*/@PostMapping("uploadFileAjax")@ResponseBodypublicResponseResultuploadFileAjax(HttpServletRequest request){MultipartHttpServletRequest multiRequest =(MultipartHttpServletRequest) request;MultipartFile file = multiRequest.getFile("files");String dir = request.getHeader("Minio-dir");return uploadFileUtil.uploadFile(file, dir);}
- 3、上传调用
Html
<p>ajax提交</p><hr><div style="height: 200px;width: 200px;position: relative;border: 1px #e2e2e2 solid"><input type="file" accept="image/*" id="imgUpload" style="position: absolute;left: 0;top: 0;opacity: 0;filter: alpha(opacity=0);height: 100%;width: 100%;z-index: 99"><img src="" alt="" id="picImg" style="height: 100%;width: 100%;position: absolute;left: 0;top: 0;"></div>
JavaScript
$('#imgUpload').change(function (){var formData =newFormData();
formData.append("files", $("#imgUpload")[0].files[0]);var index = layer.load();
$.ajax({
type :"POST",
cache:false,
dataType:"json",
data : formData,
processData :false,
contentType :false,
url: baseUrl +'uploadFileAjax',
success:function(res){
layer.close(index);
layer.msg(res.msg);if(200== res.code){
$('#picImg').attr('src',res.data);}},
error:function(){
layer.close(index);
layer.msg("服务器异常!");}});});
五、上传测试
点击上传
图片上传成功,转到上传目录:
成功上传至项目的 resources/static/upload/ 目录下
如您在阅读中发现不足,欢迎留言!!!
版权归原作者 Asurplus 所有, 如有侵权,请联系我们删除。