最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot+vue實現(xiàn)頁面下載文件

 更新時間:2020年12月22日 13:01:24   作者:Wenchao Zhang  
這篇文章主要為大家詳細(xì)介紹了springboot+vue實現(xiàn)頁面下載文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了springboot+vue頁面下載文件的具體代碼,供大家參考,具體內(nèi)容如下

1.前端代碼:

<template v-slot:operate="{ row }">
   <vxe-button style="color: #409eff; font-weight: bolder" class="el-icon-download" title="成果下載" circle @click="downloadFile(row)"></vxe-button>
</template>
downloadFile(row) {
 window.location = "http://localhost:8001/file/downloadFile?taskId=" + row.id;
}

2.后端代碼:

package com.gridknow.analyse.controller;


import com.alibaba.fastjson.JSON;
import com.gridknow.analyse.entity.DataInfo;
import com.gridknow.analyse.service.FileService;
import com.gridknow.analyse.utils.Download;
import com.gridknow.analyse.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.Map;


/**
 * @ClassName FileController
 * @Description: TODO
 * @Author Administrator
 * @Date 2020/8/20 14:02
 * @Version TODO
 **/

@Controller
@RequestMapping("/file")
public class FileController {

 @Value("${gridknow.mltc.imgurl}")
 private String imgUrl;

 @Autowired
 private FileService fileService;


 @CrossOrigin
 @RequestMapping(value = "/upload", method = RequestMethod.POST)
 @ResponseBody
 public Result upload(MultipartHttpServletRequest request) {
  List<MultipartFile> multipartFiles = request.getFiles("file");
  Map<String, Object> map = (Map<String, Object>) JSON.parse(request.getParameter("body"));
  String companyId = request.getParameter("companyId");
  String companyName = request.getParameter("companyName");
  boolean bool = fileService.uploadAndInsert(multipartFiles, map, companyId, companyName);
  if (bool) {
   return new Result(200);
  } else {
   return new Result(500);
  }
 }

 @GetMapping("/downloadFile")
 public ResponseEntity<Object> downloadFile(@RequestParam("taskId") String taskId, HttpServletResponse response) {
  DataInfo dataInfo = fileService.queryTaskById(taskId);
  if (dataInfo == null) {
   return null;
  }
  File file = new File(dataInfo.getResponseUrl());
  // 文件下載
  if (file.isFile()) {
   return downloadFile(taskId);
  }
  // 文件夾壓縮成zip下載
  if (file.isDirectory()) {
   String parent = file.getParent();
   // 創(chuàng)建臨時存放文件夾
   File temDir = new File(parent + "/" + taskId);
   if (!temDir.exists()) {
    temDir.mkdirs();
   }
   // 將需要下載的文件夾和內(nèi)容拷貝到臨時文件夾中
   try {
    Download.copyDir(dataInfo.getResponseUrl(), parent + "/" + taskId);
   } catch (IOException e) {
    e.printStackTrace();
   }
   // 設(shè)置頭部格式
   response.setContentType("application/zip");
   response.setHeader("Content-Disposition", "attachment; filename="+taskId+".zip");
   // 調(diào)用工具類,下載zip壓縮包
   try {
    Download.toZip(temDir.getPath(), response.getOutputStream(), true);
   } catch (IOException e) {
    e.printStackTrace();
   }
   // 刪除臨時文件夾和內(nèi)容
   Download.delAllFile(new File(parent + "/" + taskId));
  }
  return null;

 }
 
 public ResponseEntity<Object> downloadFile(String taskId) {
  DataInfo dataInfo = fileService.queryTaskById(taskId);
  if (dataInfo == null) {
   return null;
  }
  File file = new File(dataInfo.getResponseUrl());
  String fileName = file.getName();
  InputStreamResource resource = null;
  try {
   resource = new InputStreamResource(new FileInputStream(file));
  } catch (Exception e) {
   e.printStackTrace();
  }
  HttpHeaders headers = new HttpHeaders();
  headers.add("Content-Disposition", String.format("attachment;filename=\"%s", fileName));
  headers.add("Cache-Control", "no-cache,no-store,must-revalidate");
  headers.add("Pragma", "no-cache");
  headers.add("Expires", "0");
  ResponseEntity<Object> responseEntity = ResponseEntity.ok()
    .headers(headers)
    .contentLength(file.length())
    .contentType(MediaType.parseMediaType("application/octet-stream"))
    .body(resource);
  return responseEntity;
 }
}

工具類

package com.gridknow.analyse.utils;

import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @ClassName Download
 * @Description: TODO
 * @Author Administrator
 * @Date 2020/9/2 9:54
 * @Version TODO
 **/
@Slf4j
public class Download {

 private static final int BUFFER_SIZE = 2 * 1024;

 public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure) throws RuntimeException {

  long start = System.currentTimeMillis();
  ZipOutputStream zos = null;
  try {
   zos = new ZipOutputStream(out);
   File sourceFile = new File(srcDir);
   compress(sourceFile, zos, sourceFile.getName(), KeepDirStructure);
   long end = System.currentTimeMillis();
   log.info("壓縮完成,耗時:" + (end - start) + " ms");
  } catch (Exception e) {
   throw new RuntimeException("zip error from ZipUtils", e);
  } finally {
   if (zos != null) {
    try {
     zos.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }


 /**
  * 遞歸壓縮方法
  *
  * @param sourceFile  源文件
  * @param zos    zip輸出流
  * @param name    壓縮后的名稱
  * @param KeepDirStructure 是否保留原來的目錄結(jié)構(gòu), true:保留目錄結(jié)構(gòu);
  *       false:所有文件跑到壓縮包根目錄下(注意:不保留目錄結(jié)構(gòu)可能會出現(xiàn)同名文件,會壓縮失敗)
  * @throws Exception
  *
  */

 private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean KeepDirStructure)
   throws Exception {

  byte[] buf = new byte[BUFFER_SIZE];
  if (sourceFile.isFile()) {
   // 向zip輸出流中添加一個zip實體,構(gòu)造器中name為zip實體的文件的名字
   zos.putNextEntry(new ZipEntry(name));
   // copy文件到zip輸出流中
   int len;
   FileInputStream in = new FileInputStream(sourceFile);
   while ((len = in.read(buf)) != -1) {
    zos.write(buf, 0, len);
   }
   // Complete the entry
   zos.closeEntry();
   in.close();
  } else {
   File[] listFiles = sourceFile.listFiles();
   if (listFiles == null || listFiles.length == 0) {
    // 需要保留原來的文件結(jié)構(gòu)時,需要對空文件夾進行處理
    if (KeepDirStructure) {
     // 空文件夾的處理
     zos.putNextEntry(new ZipEntry(name + "/"));
     // 沒有文件,不需要文件的copy
     zos.closeEntry();
    }
   } else {
    for (File file : listFiles) {
     // 判斷是否需要保留原來的文件結(jié)構(gòu)
     if (KeepDirStructure) {
      // 注意:file.getName()前面需要帶上父文件夾的名字加一斜杠,
      // 不然最后壓縮包中就不能保留原來的文件結(jié)構(gòu),即:所有文件都跑到壓縮包根目錄下了
      compress(file, zos, name + "/" + file.getName(), KeepDirStructure);
     } else {
      compress(file, zos, file.getName(), KeepDirStructure);
     }
    }
   }
  }
 }

 /**
  * 拷貝文件夾
  *
  * @param oldPath 原文件夾
  * @param newPath 指定文件夾
  */
 public static void copyDir(String oldPath, String newPath) throws IOException {
  File file = new File(oldPath);
  //文件名稱列表
  String[] filePath = file.list();

  if (!(new File(newPath)).exists()) {
   (new File(newPath)).mkdir();
  }

  for (int i = 0; i < filePath.length; i++) {
   if ((new File(oldPath + File.separator + filePath[i])).isDirectory()) {
    copyDir(oldPath + File.separator + filePath[i], newPath + File.separator + filePath[i]);
   }

   if (new File(oldPath + File.separator + filePath[i]).isFile()) {
    copyFile(oldPath + File.separator + filePath[i], newPath + File.separator + filePath[i]);
   }

  }
 }

 /**
  * 拷貝文件
  *
  * @param oldPath 資源文件
  * @param newPath 指定文件
  */
 public static void copyFile(String oldPath, String newPath) throws IOException {
  File oldFile = new File(oldPath);
  File file = new File(newPath);
  FileInputStream in = new FileInputStream(oldFile);
  FileOutputStream out = new FileOutputStream(file);;

  byte[] buffer=new byte[2097152];

  while((in.read(buffer)) != -1){
   out.write(buffer);
  }
  in.close();
  out.close();
 }

 /**
  * 刪除文件或文件夾
  * @param directory
  */
 public static void delAllFile(File directory){
  if (!directory.isDirectory()){
   directory.delete();
  } else{
   File [] files = directory.listFiles();

   // 空文件夾
   if (files.length == 0){
    directory.delete();
    System.out.println("刪除" + directory.getAbsolutePath());
    return;
   }

   // 刪除子文件夾和子文件
   for (File file : files){
    if (file.isDirectory()){
     delAllFile(file);
    } else {
     file.delete();
     System.out.println("刪除" + file.getAbsolutePath());
    }
   }

   // 刪除文件夾本身
   directory.delete();
   System.out.println("刪除" + directory.getAbsolutePath());
  }
 }

}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • mybatis關(guān)系映射之一對多和多對一

    mybatis關(guān)系映射之一對多和多對一

    今天小編就為大家分享一篇關(guān)于mybatis關(guān)系映射之一對多和多對一,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java向kettle8.0傳遞參數(shù)的方式總結(jié)

    Java向kettle8.0傳遞參數(shù)的方式總結(jié)

    介紹了如何在Kettle中傳遞參數(shù)到轉(zhuǎn)換和作業(yè)中,包括設(shè)置全局properties、使用TransMeta和JobMeta的parameterValue,以及通過EL表達式獲取參數(shù)值
    2025-01-01
  • Spring Boot快速實現(xiàn) IP地址解析的示例詳解

    Spring Boot快速實現(xiàn) IP地址解析的示例詳解

    這篇文章主要介紹了Spring Boot快速實現(xiàn)IP地址解析,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • java通過反射創(chuàng)建對象并調(diào)用方法

    java通過反射創(chuàng)建對象并調(diào)用方法

    這篇文章主要介紹了java通過反射創(chuàng)建對象并調(diào)用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Spring Data JPA中findOne()和getOne()用法

    Spring Data JPA中findOne()和getOne()用法

    這篇文章主要介紹了Spring Data JPA中findOne()和getOne()的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java線程池的優(yōu)點及池化技術(shù)的應(yīng)用

    Java線程池的優(yōu)點及池化技術(shù)的應(yīng)用

    這篇文章主要介紹了Java線程池的優(yōu)點及池化技術(shù)的應(yīng)用,Java種提高程序的執(zhí)行效率有兩種實現(xiàn)方法,一個是使用線程、另一個是使用線程池,下文我們就來具體介紹該詳細(xì)內(nèi)容吧,需要的小伙伴可以參考一下
    2022-05-05
  • Java中使用HashMap時指定初始化容量性能解析

    Java中使用HashMap時指定初始化容量性能解析

    這篇文章主要為大家介紹了Java中使用HashMap時指定初始化容量性能解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • springmvc學(xué)習(xí)筆記-返回json的日期格式問題的解決方法

    springmvc學(xué)習(xí)筆記-返回json的日期格式問題的解決方法

    本篇文章主要介紹了springmvc學(xué)習(xí)筆記-返回json的日期格式問題的解決方法,解決了日期格式的輸出,有興趣的可以了解一下。
    2017-01-01
  • mybatis中bind標(biāo)簽和concat的使用說明

    mybatis中bind標(biāo)簽和concat的使用說明

    這篇文章主要介紹了mybatis中bind標(biāo)簽和concat的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • mybatis-plus 如何配置邏輯刪除

    mybatis-plus 如何配置邏輯刪除

    這篇文章主要介紹了mybatis-plus 如何配置邏輯刪除,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論

崇仁县| 普格县| 桐城市| 电白县| 吉木乃县| 邹城市| 兴义市| 新蔡县| 涪陵区| 澄迈县| 韶山市| 乌海市| 隆子县| 丹巴县| 丹巴县| 武乡县| 邵阳县| 革吉县| 杨浦区| 益阳市| 广河县| 定南县| 甘孜县| 石屏县| 辽宁省| 泰州市| 卢湾区| 睢宁县| 建湖县| 微山县| 南汇区| 多伦县| 运城市| 邯郸市| 呼图壁县| 仪征市| 肇源县| 尚志市| 灵寿县| 威远县| 广灵县|