vue中,实现阿里云OSS文件管理

开发环境

编辑器:VsCode
Vue:2.6.14
Less:4.0.0
ali-oss:6.17.1
ant-design-vue:1.7.8

阿里云OSS官方文档:点击打开

OSS配置

1、进入阿里云OSS控制台 -> Bucket管理 -> 数据安全 -> 跨域设置

image.png

2、创建如下一条规则:

image.png

依赖安装

1、Ant Design Vue:npm install ant-design-vue@1.7.8 --save

2、ali-oss:npm install ali-oss --save

在main.js中引入Antd依赖

// Antd依赖
import Antd from 'ant-design-vue';
// Antd样式依赖
import 'ant-design-vue/dist/antd.css';
// 全局使用Antd
Vue.use(Antd);

效果演示

动画.gif

image.png

完整代码

vue文件

<template>
    <div class="bodys">
        <!-- 标题部分 -->
        <div class="title">
            <!-- 阿里云logo -->
            <div style="color: #fe6a00; font-size: 1.8rem"><a-icon type="aliyun" /></div>
            <!-- 标题文字 -->
            <div>{{ title }}</div>
        </div>

        <!-- 功能操作部分 -->
        <div class="btns">
            <!-- 文件名称搜索框 -->
            <div>
                <a-input v-model="queryInfo.fileName" placeholder="文件名称搜索">
                    <a-icon slot="prefix" type="search" />
                </a-input>
            </div>
            <!-- 搜索按钮 -->
            <div>
                <a-button type="primary" icon="search" @click="queryAllOssFileList">搜索</a-button>
            </div>
            <!-- 重置搜索按钮 -->
            <div>
                <a-button icon="redo" @click="resetQuery">重置搜索</a-button>
            </div>
        </div>

        <!-- 数据表格部分 -->
        <div class="dataTable">
            <a-table :columns="columns" :data-source="fileList" rowKey="name" :loading="loading">
                <span slot="size" slot-scope="text, record"> {{ formatFileSize(record.size) }} </span>
                <span slot="lastModified" slot-scope="text, record"> {{ formatDate(record.lastModified) }} </span>
                <span slot="doit" slot-scope="text, record">
                    <div class="dtBtns">
                        <div>
                            <a-button icon="vertical-align-bottom" @click="downloadOssFile(record.name)">下载</a-button>
                        </div>
                        <div>
                            <a-button type="danger" icon="delete" @click="deleteOssFile(record.name)">删除</a-button>
                        </div>
                    </div>
                </span>
            </a-table>
        </div>

        <!-- 文件上传部分 -->
        <div class="upload">
            <a-upload-dragger :showUploadList="false" :beforeUpload="beforeUpload">
                <p class="ant-upload-drag-icon">
                    <a-icon type="folder" />
                </p>
                <p class="ant-upload-text">选择上传的文件</p>
                <p class="ant-upload-hint">点击选择,或将文件拖拽至此处上传</p>
            </a-upload-dragger>
        </div>
    </div>
</template>

<script>
// 获取oss客户端对象
const OSS = require('ali-oss');
export default {
    name: 'DemoOne',
    data() {
        return {
            // 网页标题
            title: '阿里云OSS - 文件管理',
            // 查询条件
            queryInfo: {
                fileName: ''
            },
            // 加载
            loading: false,
            // oss文件集合
            fileList: [],
            // 数据表格配置
            columns: [
                {
                    title: '文件名称',
                    dataIndex: 'name',
                    key: 'name',
                    align: 'center'
                },
                {
                    title: '文件大小',
                    dataIndex: 'size',
                    key: 'size',
                    scopedSlots: { customRender: 'size' },
                    align: 'center'
                },
                {
                    title: '更新时间',
                    dataIndex: 'lastModified',
                    key: 'lastModified',
                    scopedSlots: { customRender: 'lastModified' },
                    align: 'center'
                },
                {
                    title: '操作',
                    dataIndex: 'doit',
                    key: 'doit',
                    scopedSlots: { customRender: 'doit' },
                    align: 'center'
                }
            ],
            // oss客户端实例 -  初始化
            client: new OSS({
                // 你的Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
                region: '你的Bucket所在地域',
                // 你的accessKeyId 和 accessKeySecret
                // 官方建议:阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
                accessKeyId: '你的accessKeyId',
                accessKeySecret: '你的accessKeySecret',
                // 你的Bucket名称。
                bucket: '你的Bucket名称'
            })
        };
    },
    mounted() {
        this.queryAllOssFileList();
    },
    methods: {
        /**
         * 下载oss文件
         * file_name 文件名称
         */
        downloadOssFile(file_name) {
            let app = this;
            // 下载函数
            async function getStream() {
                try {
                    // 自定义响应头
                    // 获取下载文件的签名URL,配置文件HTTP头中的Content-Disposition为attachment,实现浏览器访问时自动下载文件,并自定义下载后的文件名称。
                    const response = {
                        'content-disposition': `attachment; filename=${encodeURIComponent(file_name)}`
                    };
                    // 填写不包含Bucket名称在内的Object完整路径。
                    // 此例上传的文件存放在根目录,所以只需要传入文件名称
                    const url = app.client.signatureUrl(file_name, { response });
                    // 新窗口打开URL
                    window.open(url);
                } catch (err) {
                    // 全局提示
                    this.$message.error('下载发生错误');
                    // 控制台答应错误
                    console.error(err);
                }
            }
            // 开始下载
            getStream();
        },
        /**
         * 删除oss文件
         * file_name 文件名称
         */
        deleteOssFile(file_name) {
            // 指定Bucket
            this.client.useBucket('你的Bucket名称');
            let app = this;
            // 删除函数
            async function deleteObject() {
                try {
                    // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
                    // 此例上传的文件存放在根目录,所以只需要传入文件名称
                    await app.client.delete(file_name);
                    // 查询oss文件
                    app.queryAllOssFileList();
                    // 全局提示
                    app.$message.success('删除成功');
                } catch (err) {
                    // 全局提示
                    app.$message.error('删除失败');
                    // 控制台答应错误
                    console.error(err);
                }
            }
            // 开始删除
            deleteObject();
        },
        // 重置oss文件查询
        resetQuery() {
            // 重置条件
            this.queryInfo = {
                fileName: ''
            };
            // 查询oss文件
            this.queryAllOssFileList();
        },
        // 查询oss文件
        queryAllOssFileList() {
            // 开始加载
            this.loading = true;
            let app = this;
            // 开始查询oss文件
            this.client
                .list({
                    // 查询符合特定前缀的文件
                    prefix: app.queryInfo.fileName
                })
                .then(function (resp) {
                    // 为了优化用户体验,我在此处加了一个延时响应,可自行删改
                    // 实际上oss的接口响应速度是极快的
                    setTimeout(() => {
                        // 停止加载
                        app.loading = false;
                        // 赋值文件集合
                        app.fileList = resp.objects;
                    }, 400);
                })
                .catch(function (err) {
                    // 停止加载
                    app.loading = false;
                    // 全局提示
                    this.$message.error('文件查询发生错误');
                    // 控制台打印错误
                    console.error(err);
                });
        },
        /**
         * 选择文件后触发的函数
         * file 选中的文件对象
         */
        beforeUpload(file) {
            // 上传oss文件
            this.ossFileUpload(file);
            // 停止组件触发上传
            // 因此处使用的是自定义的上传方式:ossFileUpload(file)
            return false;
        },
        /**
         * 上传oss文件
         * file 文件对象
         */
        ossFileUpload(file) {
            // 自定义头部信息
            const headers = {
                // 指定Object的存储类型。
                'x-oss-storage-class': 'Standard',
                // 指定Object的访问权限。
                'x-oss-object-acl': 'private',
                // 指定PutObject操作时是否覆盖同名目标Object。
                // 此处设置为true,表示禁止覆盖同名Object。
                'x-oss-forbid-overwrite': 'true'
            };
            let app = this;
            // 开始上传文件
            this.client
                // put(文件名称,文件对象,{ 自定义头部信息 })
                .put(file.name, file, { headers })
                .then(function () {
                    // 全局提示
                    app.$message.success('文件上传成功');
                    // 查询oss文件
                    app.queryAllOssFileList();
                })
                .catch(function (err) {
                    // 全局提示
                    app.$message.error('文件上传失败');
                    // 控制台打印错误
                    console.error(err);
                });
        },
        /**
         * 格式化日期和时间
         * value 日期和时间值
         */
        formatDate(value) {
            try {
                let date = new Date(value);
                let year = date.getFullYear() + '';
                let month = date.getMonth() + 1;
                let day = date.getDate();
                let hour = date.getHours();
                let minute = date.getMinutes();
                let second = date.getSeconds();
                month = month < 10 ? '0' + month : '' + month;
                day = day < 10 ? '0' + day : '' + day;
                hour = hour < 10 ? '0' + hour : '' + hour;
                minute = minute < 10 ? '0' + minute : '' + minute;
                second = second < 10 ? '0' + second : '' + second;
                // 日期和时间的格式 - 可自定义
                // 例如:yyyy年MM月dd日 hh时mm分ss秒、yyyy年MM月dd日 hh:mm:ss等
                let format = 'yyyy-MM-dd hh:mm:ss';
                format = format.replace(/yyyy/g, year);
                format = format.replace(/MM/g, month);
                format = format.replace(/dd/g, day);
                format = format.replace(/hh/g, hour);
                format = format.replace(/mm/g, minute);
                format = format.replace(/ss/g, second);
                return format;
            } catch (ex) {
                console.error(ex);
                return '';
            }
        },
        /**
         * 格式化文件大小
         * size 文件大小(单位:字节)
         */
        formatFileSize(size) {
            if (size == null || size == '') {
                return '0B';
            }
            let unitArr = new Array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
            let index = 0;
            let srcsize = parseFloat(size);
            index = Math.floor(Math.log(srcsize) / Math.log(1024));
            let sizes = srcsize / Math.pow(1024, index);
            sizes = sizes.toFixed(2);
            return sizes + unitArr[index];
        }
    }
};
</script>

<style lang="less" scoped>
.upload {
    margin: 1%;
}

.dtBtns {
    display: flex;
    justify-content: center;
    > div {
        margin: 0 1%;
    }
}

.dataTable {
    margin: 0 1%;
}

.btns {
    display: flex;
    justify-content: flex-end;
    margin: 2% 3%;
    > div {
        margin: 0 0.4%;
    }
}

.title {
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 24px;
    font-weight: bold;
    padding: 1% 0;
    > div {
        margin: 0 0.5%;
    }
}

.bodys {
    margin: 0px;
    overflow-x: hidden;
}
</style>

需要修改的地方

  • 1、oss客户端实例初始化
    image.png

  • 2、删除oss文件函数
    image.png

结语

1、如有不懂或者疑问,可私信我,看到必回
2、此示例的数据表格 没有做分页处理,阿里云OSS官方 没有 直接给出 分页功能,但也通过 其他方式 可以实现
3、此示例为 纯前端实现,后端开发者也可以参考一下,实际开发也可以前后端结合实现
4、此示例中的 OSS文件操作相关代码 都是基于 官方文档复制 的,基本未作修改,仅供演示
5、具体使用,请参考官方文档

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYqmi5S1' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片