Antd Upload 文件加密及分片上传实现逻辑

更改Upload上传模式,改成手动上传文件

Upload改成手动上传模式
##变更为手动模式后,我们可以在Upload的beforeUpload里面对上传的文件进行切片和md5加密,吧切片和md5值放到state里面,然后我们在我们自定义的Button里的onClick事件里调用state值进行上传即可

 <Upload {...props}>
          <Button>
            <UploadOutlined /> Select File
          </Button>
        </Upload>
        <Button
          type="primary"
          onClick={this.handleUpload}
          disabled={fileList.length === 0}
          loading={uploading}
          style={{ marginTop: 16 }}
        >
          {uploading ? 'Uploading' : 'Start Upload'}
        </Button>
###自定义上传方法
handleUpload = () => {
        const { fileList, md5, saveConfig } = this.state;
        const formData = new FormData();
        fileList.forEach(file => {
            formData.append('file', file);
        });
        this.setState({
            isUploading: true,
            importLoading: true,
            modalVisible: false,
            ModalVisible2: true,
            isUpload: false,
        })
        clearInterval(this.state.timer)
        this.state.timer = setInterval(() => {
            if (this.state.percent < 99) {
                this.setState(
                    {
                        percent: this.state.percent + 1,
                    }, () => {
                    }
                );
            }
        }, 5000);
        reqwest({
            url: '/api/system/SystemUpgrade',
            method: 'post',
            processData: false,
            headers: { 'saveConfig': saveConfig?1:0, 'md5': md5 },
            data: formData,
            success: (res) => {
             let message = formatMessage({id: "app.policy.msg.sys.success"})
                    this.setState({
                        isUpload: false,
                        isUploading: false,
                        importLoading: false,
                        loading: false,
                        percent: 100,
                        process_status: 'success',
                        uploadMessage: message,
                        fileList: [],
                        uploading: false,
                    })
                setTimeout("window.location.href = '#/auth/login'",2000)
            },
            error: () => {
                this.setState({
                    uploading: false,
                });
                this.setState({
                    isUpload: false,
                    isUploading: false,
                    importLoading: false,
                    loading: false,
                    process_status: 'exception',
                    fileList: [],
                    uploading: false,
                    percent: 100,
                    uploadMessage: formatMessage({ id: 'app.policy.msg.sys.fail' })
                })
                message.error(formatMessage({ 'id': 'app.policy.msg.sys.fail' }));
            },
        });
    };
###定义Upload属性,对file进行处理,我这里只进行md5加密,因为后端采用了流式接受数据,所以前端未分片,分片可以在对文件进行分片md5加密时同时进行
  const uploadProps = {
            accept: '.gz',
            showUploadList: true,
            multiple: false,
            beforeUpload: (file) => {
                this.setState({
                    fileMessage: '',
                })
                if (file.type !== 'application/x-gzip') {
                    this.setState({
                        fileMessage: formatMessage({ 'id': 'app.policy.msg.file.error' }),
                        fileList: [],
                        uploading: false,
                    })
                }
                var fileMd5 = ''
                var blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice,
                    chunkSize = 2097152, // 每次读取2MB
                    chunks = Math.ceil(file.size / chunkSize),
                    currentChunk = 0,
                    spark = new SparkMD5.ArrayBuffer(),
                    frOnload = (e) => {
                        spark.append(e.target.result);
                        currentChunk++;
                        if (currentChunk < chunks)
                            loadNext();
                        else {
                        ###最后一个chunk
                            fileMd5 = spark.end()
                            this.setState(state => ({
                                md5: fileMd5,
                                fileList: [...state.fileList, file],
                                        percent: 1,
                                        uploadMessage: '',
                                        process_status: '',
                            }));
                        }

                    },
                    frOnerror = function () {

                    };
                function loadNext() {
                    var fileReader = new FileReader();
                    fileReader.onload = frOnload;
                    fileReader.onerror = frOnerror;
                    var start = currentChunk * chunkSize,
                        end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSize;
                    fileReader.readAsArrayBuffer(blobSlice.call(file, start, end));
                };
                loadNext();


                return false;
            },
            onRemove: file => {
                this.setState(state => {
                    const index = state.fileList.indexOf(file);
                    const newFileList = state.fileList.slice();
                    newFileList.splice(index, 1);
                    return {
                        fileList: newFileList,
                    };
                });
            },
            fileList,
        }
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老虎爱代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值