Web Uploader 分片上传 组件

官网下载 Web Uploader包 放入项目 static 文件夹下

下载 - Web Uploader icon-default.png?t=M4ADhttp://fex.baidu.com/webuploader/download.htmlcomponents中新增  upload.vue

<template>
    <section class="content">
        <div class="container">
            <div class="alert alert-info">可以上传大文件</div>
        </div>

        <div class="container" style="margin-top: 16px">
            <div id="uploader" class="container">
                <div class="container">
                    <div id="fileList" class="uploader-list"></div>
                    <!--存放文件的容器-->
                </div>
                <div class="btns">
                    <div
                        id="picker"
                        class="webuploader-container"
                        style="
                            float: left;
                            margin-right: 10px;
                            widows: 86px;
                            height: 39px;
                        "
                    >
                        <div>
                            选择文件
                            <input
                                type="file"
                                name="file"
                                class="webuploader-element-invisible"
                                multiple="multiple"
                            />
                        </div>
                    </div>

                    <div
                        id="UploadBtn"
                        class="webuploader-pick"
                        style="float: left; margin-right: 10px"
                    >
                        开始上传
                    </div>
                    <div
                        id="StopBtn"
                        class="webuploader-pick"
                        style="float: left; margin-right: 10px"
                        status="suspend"
                    >
                        暂停上传
                    </div>
                </div>
            </div>
        </div>
    </section>
</template>
<script>
import "../static/upload/js/jquery-2.1.1.min.js";
import "../static/upload/webuploader/webuploader.css";
import "../static/upload/webuploader/webuploader.nolog";
import { setStore, getStore, removeStroe } from "../utils/storage.js";
import { ElMessageBox, ElMessage } from "element-plus";
export default {
    props: {
        id: String,
    },
    mounted() {
        // 获取依赖的资源 - 如果需要异步加载的话
        Promise.all([]).then(() => {
            let that = this;
            $(function () {
                var $list = $("#fileList");
                var flie_count = 0;
                var uploader = WebUploader.create({
                    //设置选完文件后是否自动上传
                    auto: false,
                    //swf文件路径
                    swf: "static/webuploader/Uploader.swf",
                    // 文件接收服务端。
                    // server: 'micro/BigFileUp',
                    server: "https://service.pututek.com/informationpush/material/upload",
                    // server: "http://192.168.1.107:7001/informationpush/material/upload",
                    // 选择文件的按钮。可选。
                    // 内部根据当前运行是创建,可能是input元素,也可能是flash.
                    pick: "#picker",
                    chunked: true, //开启分块上传
                    chunkSize: 10 * 1024 * 1024,
                    chunkRetry: 3, //网络问题上传失败后重试次数
                    threads: 1, //上传并发数
                    //fileNumLimit :1,
                    fileSizeLimit: 2000 * 1024 * 1024, //最大2GB
                    fileSingleSizeLimit: 2000 * 1024 * 1024,
                    resize: false, //不压缩
                    //选择文件类型
                    accept: {
                        // title: "Video",
                        // extensions: "mp4,avi",
                        mimeTypes:
                            "video/*,image/*,.mp3,.doc,.docx,.xlsx,.xls,.pptx,.pdf",
                    },
                });
                // 当有文件被添加进队列的时候
                uploader.on("fileQueued", function (file) {
                    // if (!file) {
                    //     return ElMessage({
                    //         type: "error",
                    //         message: "请先选择需要上传的文件",
                    //     });
                    // }
                    $list.append(
                        '<div id="' +
                            file.id +
                            '" class="item">' +
                            '<h4 class="info">' +
                            file.name +
                            '<button type="button" fileId="' +
                            file.id +
                            '" class="btn btn-danger btn-delete"><span class="glyphicon glyphicon-trash"></span></button></h4>' +
                            '<p class="state">正在计算文件MD5...请等待计算完毕后再点击上传!</p><input type="text" id="s_WU_FILE_' +
                            flie_count +
                            '" />' +
                            "</div>"
                    );
                    console.info("id=file_" + flie_count);
                    flie_count++;

                    //删除要上传的文件
                    //每次添加文件都给btn-delete绑定删除方法
                    $(".btn-delete").click(function () {
                        //console.log($(this).attr("fileId"));//拿到文件id
                        uploader.removeFile(
                            uploader.getFile($(this).attr("fileId"), true)
                        );
                        $(this).parent().parent().fadeOut(); //视觉上消失了
                        $(this).parent().parent().remove(); //DOM上删除了
                    });
                    //uploader.options.formData.guid = WebUploader.guid();//每个文件都附带一个guid,以在服务端确定哪些文件块本来是一个
                    //console.info("guid= "+WebUploader.guid());

                    //md5计算
                    uploader
                        .md5File(file)
                        .progress(function (percentage) {
                            console.log("Percentage:", percentage);
                        })
                        // 完成
                        .then(function (fileMd5) {
                            // 完成
                            var end = +new Date();
                            console.log(
                                "before-send-file  preupload: file.size=" +
                                    file.size +
                                    " file.md5=" +
                                    fileMd5
                            );
                            file.wholeMd5 = fileMd5; //获取到了md5
                            //uploader.options.formData.md5value = file.wholeMd5;//每个文件都附带一个md5,便于实现秒传

                            $("#" + file.id)
                                .find("p.state")
                                .text("MD5计算完毕,可以点击上传了");
                            console.info("MD5=" + fileMd5);
                        });
                });
                // 文件上传过程中创建进度条实时显示。
                uploader.on("uploadProgress", function (file, percentage) {
                    // console.log(file, percentage);
                    var $li = $("#" + file.id),
                        $percent = $li.find(".progress .progress-bar");
                    // 避免重复创建
                    if (!$percent.length) {
                        $percent = $(
                            '<div class="progress progress-striped active">' +
                                '<div class="progress-bar" role="progressbar" style="width: 0%">' +
                                "</div>" +
                                "</div>"
                        )
                            .appendTo($li)
                            .find(".progress-bar");
                    }
                    $li.find("p.state").text("上传中");
                    $percent.css("width", percentage * 100 + "%");
                    if (percentage == 1) {
                        debugger;
                        that.$emit("getMaterialList", getStore("fdrId"));
                    }
                });
                //发送前填充数据
                uploader.on(
                    "uploadBeforeSend",
                    function (block, data, headers) {
                        // block为分块数据。
                        headers["INFORMATIONPUTUID"] = JSON.parse(
                            localStorage.getItem("userToken")
                        ).data;
                        // file为分块对应的file对象。
                        var file = block.file;
                        var fileMd5 = file.wholeMd5;
                        // 修改data可以控制发送哪些携带数据。

                        console.info(
                            "fileName= " +
                                file.name +
                                " fileMd5= " +
                                fileMd5 +
                                " fileId= " +
                                file.id
                        );
                        console.info("input file= " + flie_count);
                        // 将存在file对象中的md5数据携带发送过去。
                        data.md5value = fileMd5; //md5
                        data.fileName_ = $("#s_" + file.id).val();
                        console.log("fileName_: " + data.fileName_);
                        console.log(getStore("fdrId"));
                        data.fdrId = getStore("fdrId");
                        // 删除其他数据
                        // delete data.key;
                        if (block.chunks > 1) {
                            //文件大于chunksize 分片上传
                            data.isChunked = true;
                            console.info("data.isChunked= " + data.isChunked);
                        } else {
                            data.isChunked = false;
                            console.info("data.isChunked=" + data.isChunked);
                        }
                    }
                );
                uploader.on("uploadSuccess", function (file) {
                    $("#" + file.id)
                        .find("p.state")
                        .text("已上传");
                    $("#" + file.id)
                        .find(".progress")
                        .find(".progress-bar")
                        .attr("class", "progress-bar progress-bar-success");
                    $("#" + file.id)
                        .find(".info")
                        .find(".btn")
                        .fadeOut("slow"); //上传完后删除"删除"按钮
                    $("#StopBtn").fadeOut("slow");
                });
                uploader.on("uploadError", function (file) {
                    $("#" + file.id)
                        .find("p.state")
                        .text("上传出错");
                    //上传出错后进度条变红
                    $("#" + file.id)
                        .find(".progress")
                        .find(".progress-bar")
                        .attr("class", "progress-bar progress-bar-danger");
                    //添加重试按钮
                    //为了防止重复添加重试按钮,做一个判断
                    //var retrybutton = $('#' + file.id).find(".btn-retry");
                    //$('#' + file.id)
                    if ($("#" + file.id).find(".btn-retry").length < 1) {
                        var btn = $(
                            '<button type="button" fileid="' +
                                file.id +
                                '" class="btn btn-success btn-retry"><span class="glyphicon glyphicon-refresh"></span></button>'
                        );
                        $("#" + file.id)
                            .find(".info")
                            .append(btn); //.find(".btn-danger")
                    }
                    $(".btn-retry").click(function () {
                        //console.log($(this).attr("fileId"));//拿到文件id
                        uploader.retry(
                            uploader.getFile($(this).attr("fileId"))
                        );
                    });
                });
                uploader.on("uploadComplete", function (file) {
                    //上传完成后回调
                    //$('#' + file.id).find('.progress').fadeOut();//上传完删除进度条
                    //$('#' + file.id + 'btn').fadeOut('slow')//上传完后删除"删除"按钮
                });
                uploader.on("uploadFinished", function () {
                    //上传完后的回调方法
                    //alert("所有文件上传完毕");
                    //提交表单
                });
                $("#UploadBtn").click(function () {
                    uploader.upload(); //上传
                });
                $("#StopBtn").click(function () {
                    console.log($("#StopBtn").attr("status"));
                    var status = $("#StopBtn").attr("status");
                    if (status == "suspend") {
                        console.log("当前按钮是暂停,即将变为继续");
                        $("#StopBtn").html("继续上传");
                        $("#StopBtn").attr("status", "continuous");
                        console.log("当前所有文件===" + uploader.getFiles());
                        console.log("=============暂停上传==============");
                        uploader.stop(true);
                        console.log(
                            "=============所有当前暂停的文件============="
                        );
                        console.log(uploader.getFiles("interrupt"));
                    } else {
                        console.log("当前按钮是继续,即将变为暂停");
                        $("#StopBtn").html("暂停上传");
                        $("#StopBtn").attr("status", "suspend");
                        console.log(
                            "===============所有当前暂停的文件=============="
                        );
                        console.log(uploader.getFiles("interrupt"));
                        uploader.upload(uploader.getFiles("interrupt"));
                    }
                });
                uploader.on("uploadAccept", function (file, response) {
                    ElMessage({
                        type: "success",
                        message: response.message,
                    });
                    if (response._raw === '{"error":true}') {
                        return false;
                    }
                });
            });
        });
    },
    destoryed() {
        // 解绑全局事件
        // 销毁实例
    },
    methods: {
        // 返回一些有用的函数
    },
};
</script>
<style lang="less">
.progress {
    margin-top: 12px;
    width: 190px;
    height: 12px;
    background: #f3f3f3;
    border-radius: 6px;
    .progress-bar {
        width: 100%;
        height: 100%;
        background: #0aa1ed;
        border-radius: 6px;
    }
    .progress-bar-danger {
        background: red !important;
    }
}
.content {
    height: 470px;
}
#uploader {
    .container {
        margin-bottom: 24px;
        .uploader-list {
            height: 360px;
            overflow-y: auto;
        }
    }
}
#picker {
    position: relative;
    width: 86px !important;
    label {
        height: 39px !important;
        width: 86px !important;
    }
    div {
        height: 39px !important;
        width: 86px !important;
    }
    .webuploader-pick {
        width: 86px !important;
        position: absolute;
        top: 0;
        left: 0;
        div {
            position: absolute;
            top: 0;
            left: 0;
            padding: 10px 15px;
        }
    }
}
</style>

使用时引用即可

//html

 <upload
            :fdrId="formFile.fdrId"  //传递属性
            @getMaterialList="getMaterialList"  //传递事件
        ></upload> 



//js
import upload from "../../components/upload.vue";

 components: {
        upload,
    },

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值