zxl
2025-06-12 9f16b5c553b479ea12fe368a7ecc748872ea8b98
web_src/src/components/dialog/recordDownload.vue
old mode 100644 new mode 100755
@@ -6,7 +6,7 @@
        <el-progress :percentage="percentage"></el-progress>
      </el-col>
      <el-col :span="6" >
        <el-button icon="el-icon-download" v-if="percentage < 100" size="mini" title="点击下载可将以缓存部分下载到本地" @click="download()">停止缓存并下载</el-button>
        <el-button icon="el-icon-download" v-if="downloadFile" size="mini" title="点击下载" @click="downloadFileClientEvent()">下载</el-button>
      </el-col>
    </el-row>
  </el-dialog>
@@ -21,12 +21,12 @@
export default {
    name: 'recordDownload',
    created() {
      window.addEventListener('beforeunload', this.stopDownloadRecord)
    },
    data() {
        return {
          title: "四倍速下载中...",
          title: "下载中...",
          deviceId: "",
          channelId: "",
          app: "",
@@ -38,8 +38,8 @@
          streamInfo: null,
          taskId: null,
          getProgressRun: false,
          getProgressForFileRun: false,
          timer: null
          timer: null,
          downloadFile: null,
        };
    },
@@ -60,7 +60,7 @@
            return;
          }
          if (this.percentage == 100 ) {
            this.getFileDownload();
            return;
          }
          setTimeout( ()=>{
@@ -71,15 +71,23 @@
        getProgress: function (callback){
          this.$axios({
            method: 'get',
            url: `./api/gb_record/download/progress/${this.deviceId}/${this.channelId}/${this.stream}`
            url: `/api/gb_record/download/progress/${this.deviceId}/${this.channelId}/${this.stream}`
          }).then((res)=> {
            console.log(res)
              if (res.data.code === 0) {
                this.streamInfo = res.data.data;
                if (parseFloat(res.data.progress) == 1) {
                  this.percentage = 100;
                }else {
                  this.percentage = (parseFloat(res.data.data.progress)*100).toFixed(1);
                }
                if (this.streamInfo.downLoadFilePath) {
                  if (location.protocol === "https:") {
                    this.downloadFile = this.streamInfo.downLoadFilePath.httpsPath;
                  }else {
                    this.downloadFile = this.streamInfo.downLoadFilePath.httpPath;
                  }
                  this.getProgressRun = false;
                  this.downloadFileClientEvent()
                }
                if (callback)callback();
              }else {
@@ -96,101 +104,47 @@
          });
        },
        close: function (){
          this.stopDownloadRecord();
          if (this.streamInfo.progress < 1) {
            this.stopDownloadRecord();
          }
          if (this.timer !== null) {
            window.clearTimeout(this.timer);
            this.timer = null;
          }
          this.showDialog=false;
          this.getProgressRun = false;
          this.getProgressForFileRun = false;
        },
        gbScale: function (scale){
          this.scale = scale;
        },
        download: function (){
          this.getProgressRun = false;
          if (this.streamInfo != null ) {
            if (this.streamInfo.progress < 1) {
              // 发送停止缓存
              this.stopDownloadRecord((res)=>{
                  this.getFileDownload()
              })
            }else {
              this.getFileDownload()
            }
          }
        },
        stopDownloadRecord: function (callback) {
          this.$axios({
            method: 'get',
            url: './api/gb_record/download/stop/' + this.deviceId + "/" + this.channelId+ "/" + this.stream
            url: '/api/gb_record/download/stop/' + this.deviceId + "/" + this.channelId+ "/" + this.stream
          }).then((res)=> {
            if (callback) callback(res)
          });
        },
        getFileDownload: function (){
          this.$axios({
            method: 'get',
            url:`./record_proxy/${this.mediaServerId}/api/record/file/download/task/add`,
            params: {
              app: this.app,
              stream: this.stream,
              startTime: null,
              endTime: null,
            }
          }).then((res) =>{
            if (res.data.code === 0 ) {
              // 查询进度
              this.title = "录像文件处理中..."
              this.taskId = res.data.data;
              this.percentage = 0.0;
              this.getProgressForFileRun = true;
              this.getProgressForFileTimer();
            }
          }).catch(function (error) {
            console.log(error);
          });
        },
        getProgressForFileTimer: function (){
          if (!this.getProgressForFileRun || this.percentage == 100) {
            return;
          }
          setTimeout( ()=>{
            if (!this.showDialog) return;
            this.getProgressForFile(this.getProgressForFileTimer())
          }, 1000)
        },
        getProgressForFile: function (callback){
          this.$axios({
            method: 'get',
            url:`./record_proxy/${this.mediaServerId}/api/record/file/download/task/list`,
            params: {
              app: this.app,
              stream: this.stream,
              taskId: this.taskId,
              isEnd: true,
            }
          }).then((res) => {
            console.log(res)
            if (res.data.code === 0) {
              if (res.data.data.length === 0){
                this.percentage = 0
                return
              }
                this.percentage = parseFloat(res.data.data.percentage)*100
                 if (res.data.data[0].percentage === '1') {
                   this.getProgressForFileRun = false;
                   window.open(res.data.data[0].downloadFile)
                   this.close();
                 }else {
                   if (callback)callback()
                 }
            }
          }).catch(function (error) {
            console.log(error);
          });
      downloadFileClientEvent: function (){
        // window.open(this.downloadFile )
        let x = new XMLHttpRequest();
        x.open("GET", this.downloadFile, true);
        x.responseType = 'blob';
        x.onload=(e)=> {
          let url = window.URL.createObjectURL(x.response)
          let a = document.createElement('a');
          a.href = url
          a.download = this.deviceId + "-" + this.channelId + ".mp4";
          a.click()
        }
        x.send();
      }
    },
    destroyed() {
      window.removeEventListener('beforeunload', this.stopDownloadRecord)
    }
};
</script>