单个文件上传和批量文件上传,pdf,docx文件的下载

一、 单个文件上传

前端代码可参考elementUI,后端代码主要上传一个文件MultipartFile multipartFile

@PostMapping("/upload")
  public ObjectRestResponse uploadKnowledge(@RequestParam(value = "multipartFile") MultipartFile multipartFile) throws IOException {
      Map map = new HashMap();
      System.out.println("multipartFile.getOriginalFilename() = " + multipartFile.getOriginalFilename());
      String originalFilename = multipartFile.getOriginalFilename();
      String substring = originalFilename.substring(originalFilename.lastIndexOf('.'));
      System.out.println(multipartFile.getName());
      if (multipartFile != null) {
          // 设置文件名称
          map.put("nameParam", multipartFile.getName());
          // 设置文件名称
          map.put("fileName", multipartFile.getName());
          // 设置文件类型
          map.put("contentType", multipartFile.getContentType());
          // 设置文件大小
          map.put("fileSize", multipartFile.getSize());

          // 创建文件名称
          String fileName = UUID.randomUUID() + substring;
          // 获取到文件的路径信息
          RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
          ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
          //文件存储路径
          String filePath = "G:\\creo\\product\\" + fileName;

          // 打印保存路径
          System.out.println(filePath);
          // 保存文件的路径信息,因为是本地存的,所以我返回的是可以访问的路径,到时候查可以直接查出来,
          //  将上传文件这个接口抽出来,可以复用,返回的路径可以存到相应的数据库
          map.put("filePath", "192.168.1.125:8765/product/" + fileName);
          // 创建文件
          File saveFile = new File(filePath);
          // 文件保存
          multipartFile.transferTo(saveFile);

      }
      return new ObjectRestResponse().data(map);
  }

postman或者apiFox测试如下:

单个文件上传和批量文件上传,pdf,docx文件的下载

二、 批量上传

批量上传主要是传一个路径,然后一层一层的读取文件,将文件上传到服务器中,我的还是上传到本地中。注意上传文件的大小是否有限制,如果报错可以参考:DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144

  • 目标:上传下面这个文件夹
    单个文件上传和批量文件上传,pdf,docx文件的下载
  • 后端代码测试:

  @Test
    public void readFiles() throws Exception{
        //上传路径
       String path = "E:\\英语\\【初中英语教资面试】必看资料@Bilibili CocoPolaris";
       readFilesDir(path);
    }

//解析文件夹
private void readFilesDir(String path) throws Exception {
        LinkedList dirList = new LinkedList<>();
        LinkedList fileList = new LinkedList<>();
        File file = new File(path);
        File[] files = file.listFiles();
        for (File file1 : files) {
            if (file1.isDirectory()){
                dirList.add(file1);
            }else {
                FileInputStream fileInputStream = new FileInputStream(file1);
                MockMultipartFile mockMultipartFile = new MockMultipartFile(file1.getName(), file1.getName(), "application/json", fileInputStream);
                //System.out.println("mockMultipartFile = " + mockMultipartFile.getName());
                fileList.add(file1.getAbsolutePath());
                System.out.println("file1 = " + file1.getAbsolutePath());

                // 创建文件名称
                String fileName = UUID.randomUUID() + "."
                        + file1.getName();

                String filePath = "G:\\temp\\" + fileName;
                // 打印保存路径
                System.out.println(filePath);
                // 创建文件
                File saveFile = new File(filePath);

                // 文件保存
                mockMultipartFile.transferTo(saveFile);

            }
        }

        File temp;
        while ((!dirList.isEmpty())){
            temp=dirList.removeFirst();
            if (temp.isDirectory()){
                files = temp.listFiles();
                if (files==null) continue;
                for (File file1 : files) {
                    if (file1.isDirectory()){
                        dirList.add(file1);
                    }else {
                        FileInputStream fileInputStream = new FileInputStream(file1);
                       MockMultipartFile mockMultipartFile = new MockMultipartFile(file1.getName(), file1.getName(), "application/json", fileInputStream);
                       // System.out.println("mockMultipartFile = " + mockMultipartFile.getName());
                        fileList.add(file1.getAbsolutePath());
                        System.out.println("file1 = " + file1.getAbsolutePath());

                        // 创建文件名称
                        String fileName = UUID.randomUUID() + "."
                                + file1.getName();
                        //存储的路径
                        String filePath = "G:\\temp\\" + fileName;
                        // 打印保存路径
                        System.out.println(filePath);
                        // 创建文件
                        File saveFile = new File(filePath);

                        // 文件保存
                        mockMultipartFile.transferTo(saveFile);
                    }
                }
            }else {
                System.out.println("======================");
            }
        }
    }
  • 结果:
    单个文件上传和批量文件上传,pdf,docx文件的下载

三、 &#x4E0B;&#x8F7D;&#x6587;&#x4EF6;pdf&#x6216;docx&#x6587;&#x4EF6;

 public void downLoad(HttpServletResponse response, String path, String fileName) throws FileNotFoundException {
        try {

            path = path.replace(STORE_PATH, LOCAL_STORE_PATH);
            // 取得文件的后缀名。
            File file = new File(path);
            String ext = path.substring(path.lastIndexOf(".") + 1);
            // 清空response
            response.reset();
            // 设置response的Header
            response.setCharacterEncoding("utf-8");
            //判断是pdf格式还是docx格式
            if (ext.equals("docx") || ext.equals("doc")) {
                response.setContentType("application/octet-stream");
            } else if (ext.equals("pdf")) {
                response.setContentType("application/pdf");
            }
            String name = URLEncoder.encode(fileName, "UTF-8");
            String fimename = URLDecoder.decode(name, "utf-8");
            response.addHeader("Content-Disposition", "attachment;filename=" + name + "." + ext);
            response.addHeader("Content-Length", "" + file.length());

            OutputStream toClient = response.getOutputStream();
            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(file));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();

            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

Original: https://www.cnblogs.com/jasmine-e/p/16252745.html
Author: 素衣黛眉
Title: 单个文件上传和批量文件上传,pdf,docx文件的下载

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621974/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 线程池

    线程池 概论 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。 线程池的好处 降低资源的消耗 提高响应速度 方便管理 总结:线程复用,可以…

    Java 2023年6月5日
    068
  • ucore操作系统学习(二) ucore lab2物理内存管理分析

    一、lab2物理内存管理介绍 操作系统的一个主要职责是管理硬件资源,并向应用程序提供具有良好抽象的接口来使用这些资源。 而内存作为重要的计算机硬件资源,也必然需要被操作系统统一的管…

    Java 2023年6月8日
    0104
  • VBA爬虫案例

    Private Sub 批量获取()Dim rowTotal!, res$, i!, t!, index! Dim objXML, objSC, obj, strModel$, q…

    Java 2023年6月16日
    049
  • java利用itext导出pdf

    项目中有一功能是导出历史记录,可以导出pdf和excel,这里先说导出pdf。在网上查可以用那些方式导出pdf,用itext比较多广泛。 导出pdf可以使用两种方式,一是可以根据已…

    Java 2023年6月13日
    090
  • IO(字符流的使用操作)

    OutputStreamWriter(使用)—写数据–(一次写入一个字符) OutputStreamWriter(OutputStream out):根据默…

    Java 2023年6月5日
    079
  • Java-Security(五):Spring Security默认登录页面渲染流程

    本篇文章主要用来阐述Spring Security渲染默认登录表单页面流程。在默认登录表单页面渲染过程中主要涉及到以下3个拦截器: 1)FilterSecurityIntercep…

    Java 2023年5月29日
    077
  • Java 基础 (Java 反射机制)

    Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。 加载完…

    Java 2023年5月29日
    084
  • Spring AOP 切点切面

    Spring AOP 切点切面 https://www.jianshu.com/p/94879042db88 https://www.jianshu.com/p/994027425…

    Java 2023年5月30日
    070
  • 2.Mybatis-常用sql

    1.Mybatis常用select语句 SELECT sr.ROLE_ID AS roleId, sr.ROLE_NAME AS roleName, sr.IS_ACTIVE AS…

    Java 2023年6月13日
    073
  • SpringCloud:SpringCloud与SpringBoot版本对应关系

    SpringCloud官网 https://spring.io/projects/spring-cloud#learn 通过版本号点击 Reference Doc ; Suppor…

    Java 2023年5月30日
    075
  • 利用Redis对批量数据实现分布式锁

    在开发的 &#x6536;&#x5165;&#x7ED3;&#x8F6C;&#x5E73;&#x53F0;&#x754C;&…

    Java 2023年6月7日
    066
  • 50道Redis高频面试题(13-20)

    十三、线上Redis持久化策略一般如何设置 如果对性能要求较高,在master最好不要做持久化,可以在某个slave开启aof备份数据,策略设置为每秒同步一次即可。 十四、一次线上…

    Java 2023年6月9日
    068
  • 【RocketMQ】消息的刷盘机制

    刷盘策略 CommitLog的 asyncPutMessage方法中可以看到在写入消息之后,调用了 submitFlushRequest方法执行刷盘策略: public class…

    Java 2023年6月8日
    071
  • 虚拟机栈的五道面试题

    虚拟机栈的五道面试题 1、举例栈溢出的情况?(StackOverFlowError) 通过-Xss设置栈的大小如果采用固定大小的java虚拟机栈,每一个线程的java虚拟机栈容量在…

    Java 2023年6月14日
    077
  • session和cookie

    第一次听到cookie这个词的时候着实兴奋了一段时间,以为是小饼干呢~快喝一杯82年的java压压惊!哈哈~ 与cookie的第一次邂逅——清缓存和清cookie 刚毕业的时候上班…

    Java 2023年5月30日
    070
  • SpringCloud-Ribbon

    1. Ribbon简介 Ribbon是一个基于HTTP和TCP的客户端负载均衡器,当使用Ribbon对服务进行访问的时候,他会扩展Eureka客户端的服务发现功能,实现从Eurek…

    Java 2023年6月7日
    073
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球