lei-mu / luch-request

luch-request 是一个基于Promise 开发的uni-app跨平台、项目级别的请求库,它有更小的体积,易用的api,方便简单的自定义能力。
https://www.quanzhan.co/luch-request/
MIT License
628 stars 96 forks source link

后台返回流下载ecxel 下出来的文件会提示损坏 #114

Closed yu5056561661 closed 1 year ago

yu5056561661 commented 1 year ago

后台返回流下载ecxel 下出来的文件会提示损坏,但是用axios 则不会,没变动过方法的内容,axios 下载的能打开,[luch-request] 则不能

lei-mu commented 1 year ago
  1. 代码
  2. 看请求头区别
yu5056561661 commented 1 year ago

代码上都没区别,请求头一样都设置 resposetype=blod

lei-mu commented 1 year ago

什么端?把代码发出来,你用的是 download 吗? 用uni.downloadFile 试试,所有功能都受限于uni

yu5056561661 commented 1 year ago

import type {HttpResponse, HttpRequestConfig, HttpError} from 'luch-request' import Request from 'luch-request' // 本地环境地址

// 局域网环境地址 // const BASE_API = '' // 线上地址 // const BASE_API = ''

const http = new Request({ //设置请求的base url baseURL: import.meta.env.VITE_BASE_API, //超时时长5分钟 timeout: import.meta.env.VITE_TIME_OUT, header: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'token': '' } }) //请求拦截器 http.interceptors.request.use( (config: HttpRequestConfig) => { // 拦截添加token

    uni.showLoading({
        title: '',
        mask:true
    });
    if(config.method.toLowerCase()=="post".toLowerCase()||config.method.toLowerCase()=="put".toLowerCase()){
        config.data.empId=getEmpId();
    }
    return config
},
(error: any) => {
    return Promise.resolve(error)
}

)

// 响应拦截器 http.interceptors.response.use( (response: HttpResponse) => { uni.hideLoading(); return response.data }, (error: HttpError) => { uni.hideLoading(); return Promise.resolve(error) } )

function formatData(data: any) { switch (data.code) { case 200: return data.data case 400: uni.showToast({ title: data.msg, icon: 'none' }) return Promise.reject(data) case 401: uni.showToast({ title: data.msg, icon: 'none' }) return Promise.reject(data) case 405: // 一般是交易查询不到 return Promise.reject(data) default: return data } }

export default http

这是request ts 下面是实际使用 const config = { method: 'get', url: '', responseType: 'blob', params: { } }; proxy.$http(config).then((res: any) => { const blob = new Blob([res]); const fileName = 'xx.xlsx';

    if (window.navigator.msSaveOrOpenBlob) {
        navigator.msSaveBlob(blob, fileName);
    } else {
        var link = document.createElement('a');
        link.href = window.URL.createObjectURL(blob);
        link.download = fileName;
        link.click();
    }
});
yu5056561661 commented 1 year ago

uniapp H5 我发现也能返回blob 也是有内容的,但是转出来的 xlsx 就打不开, 但是 用axios 返回的blob 都能打开

lei-mu commented 1 year ago

用download 试试。uni responseType: 'blob', 不是一个合法值

yu5056561661 commented 1 year ago

我看文档上有 responseType 这个嘛

lei-mu commented 1 year ago

image

yu5056561661 commented 1 year ago

我后台是返回的流 ,这个download 也是支持流下载的吗? 怎么写还是new blob 吗?

lei-mu commented 1 year ago
this.$http
                .get('http://localhost:3000/v1/download-image', {
                    responseType: 'arraybuffer'
                })
                .then(res => {
                    console.log(res);
                    let blob = new Blob([res.data], {
                        type: 'application/pdf;charset=UTF-8'
                    });
                    var a = document.createElement('a');
                    document.body.appendChild(a);
                    a.style = 'display: none';
                    var url = window.URL.createObjectURL(blob);
                    a.href = url;
                    a.download = `ss.png`;
                    a.click();
                    a.remove();
                    window.URL.revokeObjectURL(url);
                });