vue上传文件MD5加密

1.下载MD5依赖
npm install crypto-js
2.在utils文件夹中新增文件md5方法文件,文件名自定义(fileMd5Sum.js)

import CryptoJs from 'crypto-js' 
export default {
    // md5值计算
    fileMd5Sum(file) {
        let CryptoJS = require("crypto-js");
        return new Promise(resolve => {
            const fileReader = new FileReader();
            fileReader.onloadend = ev => {
                resolve(
                    CryptoJS.MD5(CryptoJS.enc.Latin1.parse(ev.target.result)).toString(
                        CryptoJS.enc.Hex
                    )
                );
            };
            fileReader.readAsBinaryString(file);
        });
    }
}

3.定义全局变量在main.js中引入

//文件md5计算方法
import fileMd5Sum from '@/utils/fileMd5Sum.js';
Vue.prototype.fileMd5Sum = fileMd5Sum;

4.使用

// files是上传的文件
this.fileMd5Sum.fileMd5Sum(files).then((res)-=>{
	console.log(res) // res就是加密后生成的md5
})

5.这是一个切片上传的例子

// dom
<el-upload :show-file-list="false" accept=".doc,.docx" ref="uploads" :limit="1" action
              :http-request="putinMirror3" :auto-upload="true">
              <el-button size="small" type="primary">数据上传</el-button>
              <el-input v-model="addform.dataTestnMame" autocomplete="off" style="width:350px;margin-left: 20px;" disabled
                v-if="first4"></el-input>
              <el-progress :text-inside="true" :stroke-width="26" :percentage="percentage4" v-if="!first4"
                style="position:absolute;left:150px;width:300px;top:0px"></el-progress>
            </el-upload>

 // 切片上传
    putinMirror3(file) {
      let param = {
        fileName: file.file.name
      }
      firstFileUp(param).then(response => {

        var uploadId = response.data.uploadId
        // 每个文件切片大小定为5MB
        var sliceSize = 50 * 1024 * 1024;
        //文件大小限制为最大10个G,可根据需求修改
        var filesizes = 100 * 1024 * 1024 * 1024;
        let that = this;
        const blob = file.file;
        const fileSize = blob.size;// 文件大小
        // this.fileNmae.push(blob.name)
        const fileName = blob.name;// 文件名
        //计算文件切片总数
        var totalSlice = 0;
        if (fileSize >= sliceSize) {
          totalSlice = Math.ceil(fileSize / sliceSize)
        } else {
          totalSlice = 1
        }

        var num = 0
        var list = []
        var guid = Date.parse(new Date())
        if (fileSize <= filesizes) {
          // 循环上传
          for (let i = 0; i < totalSlice; i++) {
            let start = i * sliceSize;
            let chunk = blob.slice(start, Math.min(fileSize, start + sliceSize));
            let files = new File([chunk], fileName)
            let partSize = files.size

            this.fileMd5Sum.fileMd5Sum(files).then(res => {
              var formData = new FormData();
              formData.append("uploadId", uploadId);
              formData.append("file", files);
              formData.append("partSize", partSize);
              formData.append("partNumber", i + 1);
              formData.append("md5Digest", res);
              let instance = axios.create({
                baseURL: 'baseUrl',
                data: formData,
                headers: { 'Content-Type': 'multipart/form-data', 'Authorization': "Bearer " + getAccessToken() }

              })
              this.first4 = false
              instance.post(`${this.uploadFileUrl}`, formData)
                .then((res) => {
                  if (res.data.code == 0) {
                    list.push(res.data.data)
                    this.percentage4 = Number(((list.length / totalSlice) * 100).toFixed(2))
                    if (list.length == totalSlice) {
                      let param = {
                        uploadId: uploadId,
                        partTags: list
                      }
                      secendFileUp(param).then(response => {
                        this.fileList4.push(response.data)
                        this.percentage4 = 100
                      });
                    }

                  } else {
                    that.$message({
                      message: res.msg,
                      type: 'error'
                    });
                  }
                })
            });
          }
        } else {
          that.$message({
            message: '文件大小超出10G',
            type: 'error'
          });
        }
      });
    },

你可能感兴趣的:(vue.js,javascript,ecmascript)