【vue】zip下载

news/2024/7/10 1:58:31 标签: vue

1.前端

<template>
	<el-button size="medium" @click="handleDownload()">
	  下载
	</el-button>    
</template>

<script>
import { downloadZip} from './api'
export default{
  name: 'test',

  data() {
    return {
      
    }
  },
  methods: {
    handleDownload(){
      downloadZip().then((res)=>{
        // if(res.data.success){
        //   this.$message.success("下载成功")
        // }
        this.download(res)
      }).catch((error)=>{
        this.$message.error("下载失败")
      });
    },
    download(res){
        const content = res.data;
        const blob = new Blob([content], { type: 'application/zip'});
        const fileName = "压缩包.zip";
        if ('download' in document.createElement('a')) { // 非IE下载
            var link = document.createElement('a');
            link.download = fileName;
            link.style.display = 'none';
            link.href = URL.createObjectURL(blob);
            document.body.appendChild(link);
            link.click();
            URL.revokeObjectURL(link.href); // 释放URL 对象
            document.body.removeChild(link);
        } else { // IE10+下载
            navigator.msSaveBlob(blob, fileName);
        }
    }
  },
 
};
</script>

2.api

import connect from './connect.js'
export const URL_PREFIX = '/test'

export const backUpRequest = (params) =>{
  return connect.get(`${URL_PREFIX}/download/download`, { params }, {}, 'blob')
}

3.connect.js

import service from './service.js'

const connect = {
  /**
   * get请求
   */
  get: (url, params, headers, responseType) => {
    return new Promise((resolve, reject) => {
      service.get(url, { ...params, headers, responseType }).then(res => {
        resolve(res)
      }).catch(err => {
        reject(err)
      })
    })
  },
  /**
   * post请求
   */
  post: (url, data, params, headers) => {
    return new Promise((resolve, reject) => {
      service.post(url, { ...data, ...params, headers }).then(res => {
        resolve(res)
      }).catch(err => {
        reject(err)
      })
    })
  },
  /**
   * delete请求
   */
  delete: (url, data, params, headers) => {
    return new Promise((resolve, reject) => {
      service.delete(url, { ...data, ...params, headers }).then(res => {
        resolve(res)
      }).catch(err => {
        reject(err)
      })
    })
  },
  /**
   * put请求
   */
  put: (url, data, params, headers) => {
    return new Promise((resolve, reject) => {
      service.put(url, { ...data, ...params, headers }).then(res => {
        resolve(res)
      }).catch(err => {
        reject(err)
      })
    })
  }
}
export default connect

4.service.js

import { extend } from 'umi-request'

const codeMessage = {
  400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限(令牌、用户名、密码错误)。',
  403: '403:用户得到授权,但是访问是被禁止的。',
  404: '404:发出的请求针对的是不存在的记录,服务器没有进行操作。',
  405: '405:方法不被允许',
  406: '406:请求的格式不可得。',
  410: '410:请求的资源被永久删除,且不会再得到的。',
  422: '422:当创建一个对象时,发生一个验证错误。',
  500: '500:服务器发生错误,请检查服务器。',
  502: '502:网关错误。',
  503: '503:服务不可用,服务器暂时过载或维护。',
  504: '当前服务器繁忙,请稍后再试'
}

/**
 * 异常处理程序
 */
const errorHandler = async (error) => {
  let errortext = ''
  if (error && error.status) {
    errortext = codeMessage[error.status]
  } else {
    errortext = 'error'
  }
  console.error(errortext)
  return Promise.reject(error)
}

/**
 * 配置request请求时的默认参数
 */
const service = extend({
  errorHandler // 默认错误处理
})

service.interceptors.request.use((url, options) => {
  const token = sessionStorage.getItem('token')
  // 为每一个请求添加时间戳,防止浏览器缓存
  options.params = {
    ...options.params,
    _t: Date.parse(new Date())
  }
  if (token) {
    const headers = { ...options.headers, Authorization: token }
    return (
      {
        url: `${url}`,
        options: { ...options, headers: headers, getResponse: true }
      }
    )
  } else {
    return (
      {
        url: `${url}`,
        options: { ...options, getResponse: true }
      }
    )
  }
})

// response拦截器, 处理response
service.interceptors.response.use((response) => {
  //const token = response.headers.get('Authorization')
  //if (token) {
    //sessionStorage.setItem('token', token)
  //}
  response = response && response.data ? response.data : response
  return response
})

export default service

5.后端

    @RequestMapping(value = "/download", method = RequestMethod.GET)
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "导出", notes = "导出")
    public ResponseEntity<byte[]> exportImageText(@RequestParam Map<String, Object> params) {
        File zipFile = new File("D:\\测试.zip");

        byte[] bytes = null;
        try {
            bytes = FileUtils.readFileToByteArray(zipFile);
        } catch (Exception e1) {
			log.error(e1.getMessage());
		}finally {
            if(zipFile.exists()){
                zipFile.delete();
            }
        }
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDispositionFormData("attachment",currentTime+".zip");
        return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);
    }

http://www.niftyadmin.cn/n/903273.html

相关文章

【js】vue跳出for循环

1.使用array.some() //some()当内部return true时跳出整个循环&#xff1a; var array [1,2,3,4,5]; var num 3; array.some(function(data){if(data num) {return true;}console.log(data); });2.使用array.every() //every()当内部return false时跳出整个循环 var array…

【vue】vue-cropper裁剪示例

1.效果示例图 2.依赖包下载 //这里使用0.5.6版本 npm install --save vue-cropper^0.5.6 或者 yarn add vue-cropper^0.5.63.引用 //main.js中添加 import VueCropper from vue-cropper Vue.use(VueCropper) //或者在页面中使用 import { VueCropper } from vue-cropper exp…

【vue】el-time-pick is-range用法时绑定数组问题

1.问题 1.el-time-pick控件is-range用法&#xff0c;当v-model用的是数组时&#xff0c;选择时间会有问题&#xff0c;如图&#xff1a; 2.代码如下 <template><el-time-pickerv-model"time" format"HH:mm:ss"value-format"HH:mm:ss&…

【vue】el-input文本框v-model数据改变时不刷新的问题

1.问题说明 1.在数组循环页面中&#xff0c;改变数组中某个底层的属性&#xff0c;对应的el-input所绑定的v-model的值改变后&#xff0c;el-input内容不更新 2.问题解决 1.可以在赋值的结尾加上this.$forceUpdate()强制更新 3.绑定的是对象的属性时&#xff0c;该属性一开始并…

【vue】avue-crud配置大全-持续更新

1.表格属性 width: 100%,//表格宽度 calcHeight: auto,//表格高度差&#xff08;主要用于减去其他部分让表格高度自适应&#xff09; height: auto,//表格高度 maxHeight: auto,//表格最大高度 border: true,//是否显示表格边框 expand: false,//是否展开折叠行 index: false,…

【js】数组join用法

var array [1,2,3] var str array.join(",") console.log(str)

【vue】vue-clipboard2剪贴板示例

1.效果示例 2.依赖包下载 //这里用的是"vue-clipboard2": "^0.3.1" npm install vue-clipboard2 //或者 yarn add vue-clipboard23.使用依赖 import VueClipboard from vue-clipboard2 Vue.use(VueClipboard);4.页面示例 <template><div style…

【vue】异步请求同步的方法

handleClick() {return new Promise((resolve,reject) > {getRequest().then(res > {//操作1resolve();}).catch(error >{console.log(error)reject()})}) }, test(){Promise.all([this.handleClick()]).then(res>{//操作2}) }