java后端分片上传接口

打印 上一主题 下一主题

主题 883|帖子 883|积分 2649

文件上传工具--FileUtil
  1. package com.youmejava.chun.util;
  2. import lombok.Data;
  3. import org.apache.tomcat.util.http.fileupload.FileUtils;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.nio.channels.FileChannel;
  9. import java.util.ArrayList;
  10. import java.util.Arrays;
  11. import java.util.Collections;
  12. import java.util.List;
  13. /**
  14. * 文件工具
  15. */
  16. @Data
  17. public class FileUtil {
  18.     private List<File> filelist;//文件列表
  19.     private String strPath;//路径
  20.     public FileUtil() {
  21.     }
  22.     public FileUtil(List<File> filelist, String strPath) {
  23.         this.filelist = filelist;
  24.         this.strPath = strPath;
  25.         getFileList(this.strPath);
  26.     }
  27.     /**
  28.      * 获取文件列表
  29.      * @param strPath
  30.      * @return
  31.      */
  32.     public List<File> getFileList(String strPath) {
  33.         File dir = new File(strPath);
  34.         File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
  35.         if (files != null) {
  36.             for (int i = 0; i < files.length; i++) {
  37.                 String fileName = files[i].getName();
  38.                 if (files[i].isDirectory()) { // 判断是文件还是文件夹
  39.                     getFileList(files[i].getAbsolutePath()); // 获取文件绝对路径
  40.                 } else  { // 判断文件名
  41.                     String strFileName = files[i].getAbsolutePath();
  42.                     //                    System.out.println("---" + strFileName);
  43.                     filelist.add(files[i]);
  44.                 }
  45.             }
  46.         }
  47.         return filelist;
  48.     }
  49.     /**
  50.      * 合并文件
  51.      * @param from
  52.      * @param to
  53.      * @throws IOException
  54.      */
  55.     public static void mergeFile(String from, String to) throws IOException {
  56.         File t = new File(to);
  57.         FileInputStream in = null;
  58.         FileChannel inChannel = null;
  59.         System.out.println("t "+t);
  60.         FileOutputStream out = new FileOutputStream(t,true);
  61.         FileChannel outChannel = out.getChannel();
  62.         File f = new File(from);
  63.         System.out.println("f "+f.isDirectory());
  64.         // 获取目录下的每一个文件名,再将每个文件一次写入目标文件
  65.         if (f.isDirectory()) {
  66.             List<File> list = getAllFileAndSort(from);
  67.             System.out.println("sortlist  "+list);
  68.             // 记录新文件最后一个数据的位置
  69.             long start = 0;
  70.             for (File file : list) {
  71.                 in = new FileInputStream(file);
  72.                 inChannel = in.getChannel();
  73.                 // 从inChannel中读取file.length()长度的数据,写入outChannel的start处
  74.                 outChannel.transferFrom(inChannel, start, file.length());
  75.                 start += file.length();
  76.                 in.close();
  77.                 inChannel.close();
  78.             }
  79.         }
  80.         out.close();
  81.         outChannel.close();
  82.     }
  83.     /**
  84.      * 所有文件排序
  85.      * @param dirPath 文件根目录路径
  86.      * @return
  87.      */
  88.     public static List<File> getAllFileAndSort(String dirPath) {
  89.         File dirFile = new File(dirPath);
  90.         File[] listFiles = dirFile.listFiles();
  91.         List<File> list = Arrays.asList(listFiles);
  92.         Collections.sort(list, (o1, o2) -> {
  93.             String _str=o1.getName().split("\\.")[0];
  94.             String _num=_str.split("_")[1];
  95.             String _str2=o2.getName().split("\\.")[0];
  96.             String _num2=_str2.split("_")[1];
  97.             return Integer.parseInt(_num) - Integer.parseInt(_num2);
  98.         });
  99.         return list;
  100.     }
  101.     /**
  102.      * 删除文件夹
  103.      * 删除文件夹需要把包含的文件及文件夹先删除,才能成功
  104.      * https://blog.csdn.net/m0_57640408/article/details/120774050
  105.      * @param directory 文件夹名
  106.      * @return 删除成功返回true,失败返回false
  107.      */
  108.     public static boolean deleteDirectory(String directory) {
  109.         // directory不以文件分隔符(/或\)结尾时,自动添加文件分隔符,不同系统下File.separator方法会自动添加相应的分隔符
  110.         if (!directory.endsWith(File.separator)) {
  111.             directory = directory + File.separator;
  112.         }
  113.         File directoryFile = new File(directory);
  114.         // 判断directory对应的文件是否存在,或者是否是一个文件夹
  115.         if (!directoryFile.exists() || !directoryFile.isDirectory()) {
  116.             System.out.println("文件夹删除失败,文件夹不存在" + directory);
  117.             return false;
  118.         }
  119.         boolean flag = true;
  120.         // 删除文件夹下的所有文件和文件夹
  121.         File[] files = directoryFile.listFiles();
  122.         for (int i = 0; i < files.length; i++) {  // 循环删除所有的子文件及子文件夹
  123.             // 删除子文件
  124.             if (files[i].isFile()) {
  125.                 flag = deleteFile(files[i].getAbsolutePath());
  126.                 if (!flag) {
  127.                     break;
  128.                 }
  129.             } else {  // 删除子文件夹
  130.                 flag = deleteDirectory(files[i].getAbsolutePath());
  131.                 if (!flag) {
  132.                     break;
  133.                 }
  134.             }
  135.         }
  136.         if (!flag) {
  137.             System.out.println("删除失败");
  138.             return false;
  139.         }
  140.         // 最后删除当前文件夹
  141.         if (directoryFile.delete()) {
  142.             System.out.println("删除成功:" + directory);
  143.             return true;
  144.         } else {
  145.             System.out.println("删除失败:" + directory);
  146.             return false;
  147.         }
  148.     }
  149.     /**
  150.      * 删除文件
  151.      *
  152.      * @param fileName 文件名
  153.      * @return 删除成功返回true,失败返回false
  154.      */
  155.     public static boolean deleteFile(String fileName) {
  156.         File file = new File(fileName);
  157.         if (file.isFile() && file.exists()) {
  158.             file.delete();
  159.             System.out.println("删除文件成功:" + fileName);
  160.             return true;
  161.         } else {
  162.             System.out.println("删除文件失败:" + fileName);
  163.             return false;
  164.         }
  165.     }
  166. }
复制代码
 
分片上传文件接口
  1.  package com.youmejava.chun.commoninterface;
  2. import com.youmejava.chun.util.FileUtil;
  3. import com.youmejava.chun.util.ResultVo;
  4. import com.youmejava.chun.util.StringUtil;
  5. import io.swagger.annotations.Api;
  6. import io.swagger.annotations.ApiImplicitParam;
  7. import io.swagger.annotations.ApiImplicitParams;
  8. import io.swagger.annotations.ApiOperation;
  9. import org.apache.shiro.authc.ExpiredCredentialsException;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.stereotype.Service;
  12. import org.springframework.transaction.annotation.Transactional;
  13. import org.springframework.web.bind.annotation.*;
  14. import org.springframework.web.multipart.MultipartFile;
  15. import org.springframework.web.multipart.MultipartHttpServletRequest;
  16. import javax.servlet.http.HttpServletRequest;
  17. import java.io.*;
  18. import java.util.Arrays;
  19. import java.util.HashMap;
  20. import java.util.List;
  21. import java.util.Map;
  22. @RestController
  23. @RequestMapping("/api/apiSystem/upload")
  24. @Api(value = "文件上传", tags = "文件上传")
  25. public class UploadController {
  26.     @Value("${filePath1}")
  27.     private String filePath;
  28.     @PostMapping("/register")
  29.     @ApiOperation(value = "文件注册", notes = "文件注册")
  30.     @ApiImplicitParams({@ApiImplicitParam(value = "哈希值", name = "hash", required = true, paramType = "body")})
  31.     public ResultVo register(@RequestBody Map<String, Object> map) {
  32.         System.out.println("hash: " + map.get("hash"));
  33.         if (!StringUtil.isNotBlankAndNull(map.get("hash").toString())) {
  34.             //            return ResultVo.failure("哈希值不可为空");
  35.             throw new ExpiredCredentialsException("哈希值不可为空!");
  36.         }
  37.         String _filePath=filePath;
  38.         if (!_filePath.endsWith("/")) {
  39.             _filePath+="/";
  40.         }
  41. //        String _pathStr = "C:\\Users\\JH-rent\\Desktop\\java启动文件\\test" + "\" + map.get("hash");
  42.         String _pathStr=_filePath+map.get("hash");
  43.         //创建不同的文件夹目录
  44.         File file = new File(_pathStr);
  45.         //判断文件夹是否存在
  46.         if (!file.exists()) {
  47.             //如果文件夹不存在,则创建新的的文件夹
  48.             file.mkdirs();
  49.         }
  50.         File f = new File(_pathStr);
  51.         // 检查目录是否已上传过文件,如果上传过,返回上传个数
  52.         if (f.isDirectory()) {
  53.             File dirFile = new File(_pathStr);
  54.             File[] listFiles = dirFile.listFiles();
  55.             List<File> list = Arrays.asList(listFiles);
  56.             if (list == null&&list.size()>0) {
  57.                 Map<String, Object>map1=new HashMap<>();
  58.                 map1.put("number",list.size());
  59.                 return ResultVo.success(map1);
  60.             }
  61.         }
  62.         return ResultVo.success();
  63.     }
  64.     @PostMapping("/uploadFile")
  65.     @ResponseBody
  66.     @ApiOperation(value = "上传文件", notes = "上传文件")
  67.     @ApiImplicitParams({@ApiImplicitParam(value = "哈希值", name = "hash", required = true, paramType = "body"), @ApiImplicitParam(value = "文件流", name = "file", required = true, paramType = "body"), @ApiImplicitParam(value = "文件名称", name = "fileName", required = true, paramType = "body"),})
  68.     public ResultVo uploadFile(HttpServletRequest request) {
  69.         MultipartHttpServletRequest params = ((MultipartHttpServletRequest) request);
  70.         List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
  71.         String _fileName = params.getParameter("fileName");
  72.         String _hash = params.getParameter("hash");
  73.         if (!StringUtil.isNotBlankAndNull(_hash)) {
  74.             throw new ExpiredCredentialsException("哈希值不可为空!");
  75.         }
  76.         if (!StringUtil.isNotBlankAndNull(_fileName)) {
  77.             throw new ExpiredCredentialsException("文件名称不可为空!");
  78.         }
  79. //        System.out.println("_fileName: " + _fileName);
  80. //        System.out.println("_hash: " + _hash);
  81. //        System.out.println("files: " + files);
  82. //        System.out.println(params.getParameter("file"));
  83. //        String _pathStr = "C:\\Users\\JH-rent\\Desktop\\java启动文件\\test" + "\" + _hash + "\";
  84.         String _filePath=filePath;
  85.         if (!_filePath.endsWith("/")) {
  86.             _filePath+="/";
  87.         }
  88.         String _pathStr =_filePath+_hash+"/";
  89.         FileOutputStream fileOut = null;
  90.         //写入到文件(注意文件保存路径的后面一定要加上文件的名称)
  91.         try {
  92.             fileOut = new FileOutputStream(_pathStr + _fileName);
  93.             BufferedOutputStream bos = new BufferedOutputStream(fileOut);
  94.             BufferedInputStream bis = null;
  95.             for (MultipartFile file : files) {
  96.                 //                file.transferTo(new File(_pathStr + file.getOriginalFilename()));
  97.                 //                System.out.println(file.getInputStream());
  98.                 bis = new BufferedInputStream(file.getInputStream());
  99.             }
  100.             byte[] buf = new byte[4096];
  101.             int length = bis.read(buf);
  102.             //保存文件
  103.             while (length != -1) {
  104.                 bos.write(buf, 0, length);
  105.                 length = bis.read(buf);
  106.             }
  107.             bos.close();
  108.             bis.close();
  109.             return ResultVo.success();
  110.         } catch (Exception e) {
  111.             e.printStackTrace();
  112.             return ResultVo.failure(e.getMessage());
  113.         }
  114.     }
  115.     @GetMapping("/getMergeFile")
  116.     @ApiOperation(value = "获取合并文件", notes = "获取合并文件")
  117.     @ApiImplicitParams({@ApiImplicitParam(value = "哈希值", name = "hash", required = true, dataType = "String"), @ApiImplicitParam(value = "文件名称", name = "fileName", required = true, dataType = "String")})
  118.     public ResultVo getMergeFile(@RequestParam(value = "hash") String hash, @RequestParam(value = "fileName") String fileName) {
  119. //        String _pathStr = "C:\\Users\\JH-rent\\Desktop\\java启动文件\\test" + "\" + hash + "\";
  120. //        String _pathStr1 = "C:\\Users\\JH-rent\\Desktop\\java启动文件\\test";
  121.         String _filePath=filePath;
  122.         if (!_filePath.endsWith("/")) {
  123.             _filePath+="/";
  124.         }
  125.         String _pathStr = _filePath + hash + "/";
  126.         String _pathStr1 = _filePath;
  127.         try {
  128. //            if (!_pathStr1.endsWith("\")) {
  129. //                _pathStr1 += "\";
  130. //            }
  131.             _pathStr1 += fileName;
  132.             FileUtil.mergeFile(_pathStr, _pathStr1);
  133.             //合并成功删除加密文件
  134.             FileUtil.deleteDirectory(_pathStr);
  135.         } catch (IOException e) {
  136.             e.printStackTrace();
  137.         }
  138.         Map<String, Object>map=new HashMap<>();
  139.         map.put("fileUrl",_pathStr1);
  140.         return ResultVo.success(map);
  141.     }
  142. }
复制代码
前端分片链接:https://www.cnblogs.com/wxchun/p/15892243.html

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表