<template>
    <div>
        <el-upload
            class="upload"
            ref="upload"
            action=""
            :before-upload="beforeUpload"
            :on-change="handleChange"
            :on-remove="handleRemove"
            :on-preview="preview"
            :on-success="success"
            :on-error="error"
            :http-request="toUpload"
            :auto-upload="false"
            :file-list="fileList"
            :on-exceed="handleExceed"
            :multiple="multiple"
        >
            <el-button type="primary" plain icon="el-icon-upload"
                >上传文件</el-button
            >
        </el-upload>
        <!--        <el-button @click="download">下载</el-button>-->
    </div>
</template>

<script>
export default {
    name: "upload",
    props: {
        // 限制上传的个数
        limit: {
            type: Number,
            default: 1,
        },
        // 一组文件传相同的值,保证其为一组
        objectPath: {
            type: String,
            default: "1",
        },
        type: {
            type: String,
            default: "4",
        },
        // 是否需要处理大文件上传
        needInstance: {
            type: Boolean,
            default: false,
        },
        // 上传url
        uploadUrl: {
            type: String,
            default: "",
        },
        multiple: {
            type: Boolean,
            default: false,
        },
    },
    data() {
        return {
            fileList: [],
            attachmentList: [],
            defaultParam: {},
        };
    },
    methods: {
        beforeUpload(file) {
            let arr = ["xls", "xlsx"];
            let i = file.name.lastIndexOf(".");

            if (!arr.includes(file.name.slice(i + 1))) {
                this.$message.warning("请上传以xlsx、xls为后缀名的Excel文件");
                return false;
            }
        },
        handleChange(file, fileList) {
            this.fileList = fileList;

            let arr = ["xls", "xlsx"];
            let i = file.name.lastIndexOf(".");

            if (!arr.includes(file.name.slice(i + 1))) {
                this.$message.warning("请上传以xlsx、xls为后缀名的Excel文件");
                return false;
            }

            this.$emit("handleChange", file);
        },
        handleExceed(files, fileList) {
            this.$message.warning(
                `当前限制选择 ${this.limit} 个文件,本次选择了 ${
                    files.length
                } 个文件,共选择了 ${files.length + fileList.length} 个文件`
            );
        },
        async handleRemove(file, fileList) {
            let md5 = "";
            if (file.raw) {
                await this.$md5(file.raw).then((res) => {
                    md5 = res;
                });
            } else {
                md5 = file.md5;
            }

            let removeIndex = "";
            this.attachmentList.forEach((item, index) => {
                if (md5 === item.md5) {
                    removeIndex = index;
                }
            });

            // if (removeIndex < 0) {
            //     this.$message.error("删除失败");
            // }

            this.attachmentList.splice(removeIndex, 1);
            this.$emit("attachmentChange", this.attachmentList);
        },
        async toUpload(file) {
            let _this = this;

            // console.log(file);
            return;

            return new Promise(async (resolve, reject) => {
                let formData = new FormData();
                await formData.append("name", file.file.name);
                // await formData.append('type', _this.defaultParam.md5)
                // console.log(this);

                await formData.append("type", this.type);
                await formData.append("objectPath", Math.random().toString());
                // await formData.append("md5", _this.defaultParam.md5);
                await formData.append("file", file.file);

                let axios = this.$axios;
                // 处理大文件上传 instance已被设置不携带token
                // if (this.needInstance) {
                //     axios = this.$instance;
                // }

                // 上传前进行通知
                this.$emit("willUpload");

                /* let url = this.uploadUrl;
                    let defaultParam = {};
                    if (!url) {
                        url = this.$api.common.uploadWj;
                        // 获取MD5值
                        await this.$md5(file.file).then((res) => {
                            defaultParam = {
                                // file: file.file,
                                md5: res,
                            };
                        });
                    } */

                let url = this.$api.sceneLibrary.saveSceneNatural;
                let defaultParam = {};
                // 获取MD5值
                await this.$md5(file.file).then((res) => {
                    defaultParam = {
                        // file: file.file,
                        md5: res,
                    };
                });

                await axios({
                    method: "post",
                    url,
                    data: formData,
                    withCredentials: true,
                    headers: {
                        "Content-type": "multipart/form-data",
                    },
                }).then((res) => {
                    if (res.code == 200) {
                        // this.attachmentList.push({
                        //     // attachmentName: file.file.name,
                        //     // attachmentAddress: res.params,
                        //     md5: defaultParam.md5 || "",
                        //     // uid: file.file.uid,
                        //     fileType: file.file.type,
                        //     // fileName: res.info.fileName,
                        //     // videoPreview: res.info.videoPreview,
                        // });
                        // resolve("成功");
                        // this.$emit("attachmentChange", this.attachmentList);
                        // 上传完成后进行通知
                        // this.$emit("didUpload", "success");
                        this.$refs.upload.clearFiles();
                        this.$emit("didUpload");
                    } else {
                        this.$message.error(res.message || "上传失败");
                        // this.$emit("didUpload", "fail");
                        // reject("失败");
                    }
                });
                // .catch((err) => {
                //     this.$emit("didUpload", "error");
                //     reject(err);
                // });
            });
        },
        success(response, file, fileList) {
            this.$message.success("上传成功 ");
        },
        error(response, file, fileList) {
            this.$message.warning("上传失败");
        },
        preview(file) {
            return false;
            console.log(file);
            console.log(this.attachmentList);
            let item = this.attachmentList.find((item) =>
                item.fileName.endsWith(file.name)
            );
            this.download(item.fileName, item.attachmentName);
        },
        download(downPath, downName) {
            this.$axios({
                method: "post",
                url: this.$api.common.download,
                responseType: "blob",
                data: {
                    objectName: downPath,
                },
            }).then((res) => {
                const blob = new Blob([res]); //构造一个blob对象来处理数据
                const fileName = downName;
                //对于<a>标签,只有 Firefox 和 Chrome(内核) 支持 download 属性
                //IE10以上支持blob但是依然不支持download
                if ("download" in document.createElement("a")) {
                    //支持a标签download的浏览器
                    const link = document.createElement("a"); //创建a标签
                    link.download = fileName; //a标签添加属性
                    link.style.display = "none";
                    link.href = URL.createObjectURL(blob);
                    document.body.appendChild(link);
                    link.click(); //执行下载
                    URL.revokeObjectURL(link.href); //释放url
                    document.body.removeChild(link); //释放标签
                } else {
                    //其他浏览器
                    navigator.msSaveBlob(blob, fileName);
                }
            });
        },
    },
};
</script>

<style scoped>
.upload /deep/ .el-upload-list {
    display: none;
}
</style>