Controller成通过post
上传方式定义接口,上传文件通常使用post
的上传方式,get
用于获取数据、文件。 单个入参可以使用@RequestParam
标注,不用封装到类里边在使用@RepuestBody
映射
@PostMapping(value = "/uploadFile") @ApiOperation(value = "文件上传", notes = "文件上传") public Result uploadFile(@RequestParam (name = "file") MultipartFile file) throws Exception { String url = fileService.uploadFile(file); }
2.1获取文件的相关信息
获取文件主要信息的目的是为了保存文件,通常会使用文件信息来作为文件的保存名称,以下是常用的文件信息获取
//获取文件名称 String originalFilename = file.getOriginalFilename(); // 截取上传文件的后缀 String uploadFileSuffix = originalFilename.substring(originalFilename.indexOf('.') + 1, originalFilename.length()); //获取文件父目录 File Parentlocaltion=localFile.getParentFile(); //获取文件绝对目录 File localFileAbsoluteFile=localFile.getAbsoluteFile();
需要获取项目所在位置,并且把文件保存到项目同一个目录下。可以用以下方式获取
String currentDir = System.getProperty("user.dir");
File(String pathname):使用给定的路径名字符串创建一个文件对象。
File(String parent, String child):使用给定的父目录路径名字符串和子目录名字符串创建一个文件对象。
createNewFile():创建一个新文件。
mkdir():创建一个新目录。
mkdirs():创建一个新目录,如果必要的话,还会递归地创建父目录。
delete():删除文件或目录。
2.2首先需要知道 JAVA根据file的路径创建文件夹
下面的代码将创建一个文件夹,如果文件夹不存在。
mkdirs() 方法将递归地创建所有必需的父文件夹。
如果您只需要创建直接的父文件夹,可以使用 mkdir() 方法。
String folderPath = "D:uploadFiles eport20230213"; File folder = new File(folderPath); if (!folder.exists()) { folder.mkdirs(); }
2.3文件保存到本地:方法一
使用此方法保存必须要绝对路径且文件夹必须已存在,否则报错,所以一般会使用mkdirs,判断文件是否存在后创建文件夹
public String uploadFile(MultipartFile file) throws Exception { File file = new File(fileName); try { //使用此方法保存必须要绝对路径且文件夹必须已存在,否则报错 String fileUrl = "D:uploadFiles eport" + fileAdd + File.separator + System.currentTimeMillis() + "." + uploadFileSuffix; File localFile = new File(fileUrl); File Parentlocaltion=localFile.getParentFile(); if (!Parentlocaltion.exists()) { //判断文件父目录是否存在 Parentlocaltion.mkdirs(); } //FileUtils.copyInputStreamToFile(file.getInputStream(), localFile); file.transferTo(localFile); } catch (IOException e) { e.printStackTrace(); return dealResultMap(false, "上传失败"); }*/ return dealResultMap(true, "上传成功"); }
注意:两个文件对象,分别表示源文件和目标文件。然后,我们创建了两个文件通道,并使用 transferTo 方法将源文件通道中的数据传输到目标文件通道中。
2.4文件保存到本地:方法二
这个方式就是很普通的流写入方式,通过文件流读取文件后,写入本地磁盘
public String uploadFile(MultipartFile file) throws Exception { String fileName = file.getOriginalFilename(); try { //获取文件字节数组 byte [] bytes = file.getBytes(); //文件存储路径(/fileupload1/ 这样会在根目录下创建问价夹) File pfile = new File("/fileupload1/"); //判断文件夹是否存在 if(!pfile.exists()){ //不存在时,创建文件夹 pfile.mkdirs(); } //创建文件 File file = new File(pfile, fileName); //写入指定文件夹 OutputStream out = new FileOutputStream(file); out.write(bytes); } catch (IOException e) { e.printStackTrace(); return dealResultMap(false, "上传失败"); } return dealResultMap(true, "上传成功"); }
这种调用方式仅限于只有file一个上传文件,入参只是file。项目中如果需要多次上传文件可以进行多次接口调用。