因为项目中经常遇到文件上传,特别是图片上传,所以特地写了一个工具类,用于对文件上传的封装,并返回相对路径!
相对路径已相对于html文件位置,可以直接存储进数据库!

在com.nunbey.lotus.utils下


类名
Upload
接口IUpload

提供的方法:

构造方法:

  1. public Upload(MultipartFile file, HttpServletRequest request)

  2. public Upload(MultipartFile[] files, HttpServletRequest request)

第一个构造函数,对于单文件上传时所需,第二是多文件时


业务方法:

保存校组织:
其中type:
      0.学院
      1.社团
      2.工作室照片

public String saveOrganizationImage(int type,String id,String name)
public List<String> saveOrganizationImages(int type, String id, String name)
保存活动:
       type:     
       0.轮播图活动
       1.基本活动
       2.考试活动
public String saveActivityImage(int type,String id,String name,String activityId)
public List<String> saveActivityImages(int type,String id,String name,String activityId)


其余参数对照数据库,保存单文件和多文件,对应上面的构造方法

方法返回绝对路径,单文件返回String,多文件返回 List<String>

私有方法:

/**
 * 创建文件夹,如果不存在,那就创建,如果存在,即不创建
 * @param children_dir 子文件夹名字
 * @return
 */
private File creat_dir(String children_dir)


/**
 * 保存文件
 * @param f                       文件的路径,可以是项目的绝对路径
 * @param fileName                文件名,流在file中
 * @return                        返回相对路径可以直接存入数据库
 * @throws Exception
 */
private String save(File f,String fileName) throws Exception

重设方法:
public void setFile(MultipartFile file) 
public void setFiles(MultipartFile[] files)
public void setRequest(HttpServletRequest request)
public String getPath()

重设的三个参数都是构造方法中的,就意味着,我们可以使用一个对象切换不同的file,files来实现不同文件的保存,
path是文件的绝对路径,可以获取


示例:
单文件:
   控制器:controller
  
@PostMapping("/load2")
public String upload2(MultipartFile file, HttpServletRequest request,String name,Integer age) throws Exception {
    Upload upload = new Upload(file,request);  //创建对象
    String path = upload.saveOrganizationImage(1,"23232323","alibaba");  调用方法
    System.out.println(path);
    return "login";
}

前端页面:html
<form action="load2" method="post" enctype="multipart/form-data">
    <input type="file" name="file"><br/>
    <input type="text" name="name"><br/>
    <input type="text" name="age"><br/>
    <input type="submit" value="提交">
</form>


多文件:
    控制器:controller
@PostMapping("/load3")
public String upload3(@RequestParam MultipartFile[] files, HttpServletRequest request) throws Exception {

    Upload upload = new Upload(files,request);
    List<String > path = upload.saveOrganizationImages(1,"23232323","alibaba");
    System.out.println(path);
    return "login";
}

    前端页面:html
<form action="load3" method="post" enctype="multipart/form-data">
    <input type="file" name="files"><br/>
    <input type="file" name="files"><br/>
    <input type="file" name="files"><br/>
    <input type="text" name="name"><br/>
    <input type="text" name="age"><br/>
    <input type="submit" value="提交">
</form>



后记:
  1. 如果只是上传一个文件,则只需要MultipartFile类型接收文件即可,而且无需显式指定@RequestParam注解

  2. 如果想上传多个文件,那么这里就要用MultipartFile[]类型来接收文件,并且还要指定@RequestParam注解

  3. 并且上传多个文件时,前台表单中的所有<input type="file"/>的name都应该是myfiles,否则参数里的myfiles无法获取到所有上传的文件