前端下载综合分析(中)

260 阅读1分钟

1-关于websocket

批量下载请求有一个后端生成压缩包的过程,一旦文件过大请求就会超时。需要后端同学配置websocket防止断开链接。 前端vue通用组件代码示例

<script>
    export default {
        props: {
            url: {
                type: String
            }
        },
        model:{
            prop: 'websocket',
            event: 'change'
        },
        mounted(){
            this.initWebSocket();
        },
        methods: {
            initWebSocket() {
                if ("WebSocket" in window) {
                    console.log("您的浏览器支持WebSocket");
                    var websocket = new WebSocket(this.url);
                    this.$emit('change', websocket);
                    this.initWatchFunc(websocket);
                } else {
                    console.log("您的浏览器不支持WebSocket");
                }
            },
            initWatchFunc(websocket){
                var _this = this;
                websocket.onopen = (e)=>{
                    console.log("连接成功!");
                    _this.$emit('onOpen',e);
                }
                websocket.onmessage = (e)=>{
                    _this.$emit('onMessage',e.data);
                }
                websocket.onclose = (e)=>{
                    console.log("断开连接!");
                    _this.$emit('onClose',e);
                }
                websocket.onerror = (e)=>{
                    console.log("连接异常!");
                    _this.$emit('onError',e);
                }
            },
        }
    }
</script>

2-页面部分需要

组件配置

 <websocket :url="websockurl" v-model="websocket" @onMessage="handerOnMessage"></websocket>

根据不同状态配置配置写入方法 progress可以获取压缩进度 successZip 获取压缩包信息,以及后端返回的压缩链接。 因为后端压缩包文件名是nginx配置中的,可能会出现乱码,需要前端重新定义下载文件名称 (参考第上篇)

 //处理服务端发送过来的消息
    handerOnMessage(msg){
                var msgJson = JSON.parse(msg);
                console.log(msgJson);
                //根据服务端返回的消息中不同的action,执行不同的方法逻辑
                if (msgJson.action == "openSession") {
                    this.clientId = msgJson.clientId;  
                } else if (msgJson.action == "progress") {
                    this.msgplxz = msgJson.msg;
                    this.percentage = msgJson.data;
                } else if (msgJson.action == "successZip") {
                  //返回一个链接执行下载操作
                }
            },

3-可能会出现的问题

  • 后端压缩包下载后需要及时删除。这里需要监听到下载完成事件。然后调用删除压缩包方法。
  • websocket返回的是打包进度,并不是下载进度,所以进度条提示方面需要注意。下载进度方法可以采用axios的onDownloadProgress
  • 如果项目中大文件很多,则要必须采用切片的方式。
  • 【关键】nginx代理 http 跟https有差异需要注意,区别在于调用地址http为ws开头而https为wss开头

下面的是进度条举例,url为返回的下载链接

axios.get(url,{
        responseType:'blob',
        onDownloadProgress: function (progressEvent) {
        let process = (progressEvent.loaded / progressEvent.total * 100 | 0)
        let progressText = `下载进度:${process}`  
      }
     }).then(res=>{
        console.log(res)
       }).catch(error => {
        console.log(error)
       })

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天 点击查看活动详情