• vue+minio实现文件上传操作


    vue+minio实现文件上传操作

    minio文件上传

    minio文件上传有两种方法:

    1. 第一种是通过ak,sk,调用minio的sdk putObject进行文件上传;该方法支持go,java,js等各种语言,
    2. 第二种是后端生成presignedUrl,前端通过该url实现文件上传;

    vue+minio实现文件上传操作

    以上说的两种方法中,第一种方法会把ak,sk暴露给前端,造成一定的安全隐患;所以如果要使用第一种方法,需要向后端请求生成临时的ak,sk;

    这边我们实现了第二种方法。

    前端代码如下,这种方法的思路是先向后端请求生成presigned-url,然后再通过binary的方式进行文件上传;注意这里有一个小坑,就是上传文件不要使用form-data,否则会在文件加上WebKitFormBoundary前缀,minio生成的presigned-url没有对此进行解析,这种上传方式会导致如.png .mp4的文件打不开。

    <template>
        <el-upload ref="uploadRef" :http-request="uploadSubmit" :auto-upload="false" v-model:file-list="fileList" :limit="1"
            :on-success="onSuccess">
            <template #trigger>
                <el-button type="primary" style="width: 100px;">select</el-button>
            </template>
            <el-button type="success" @click="uploadRef.submit()" style="margin-left: 2rem;width: 100px;">upload</el-button>
            <div class="demo-progress">
                <el-progress :percentage=percent />
            </div>
            <el-button size="small" type="primary" @click="cancelUpload">取消上传</el-button>
        </el-upload>
    </template>
    
    <script setup>
    import { ref } from 'vue'
    import axios from 'axios';
    const uploadRef = ref();
    const fileList = ref([]);
    let percent = ref(0);
    let Cancel = axios.CancelToken.source()
    
    async function uploadSubmit(options) {
        console.log(options)
        const item = options['file'];
    
        var presignedUrl = ""
        var objSize = item.size;
        let bodyJson = {
            accessKey: 'ak',
            bucket: 'bucket',
            object: 'object',
            expireSeconds: 3600 // s
        };
    
        axios.put('/path/uploadUrl', bodyJson).then(res => {
            if (res.status == 200) {
                presignedUrl = res.data.data
                axios({
                    method: "put",
                    url: presignedUrl,
                    data: item, // 重点1,直接将原始二进制流赋给data
                    headers: {
                        "Content-Type": "application/octet-stream", // 重点2
                    },
                    timeout: 3600000, // ms
                    onUploadProgress: function (e) {
                        percent.value = parseInt(e.loaded / objSize * 100);
                    },
                    cancelToken: Cancel.token
                }).then(res => {
                    if (res.status == 200) {
                        console.log('success')
                    }
                }).catch(
                    err => {
                        console.log(err)
                    }
                )   
            }
        })
    }
    
    const onSuccess = (response, file, fileList) => {
        console.log(response);
        console.log(file);
        console.log(fileList);
    }
    
    function cancelUpload() {
        Cancel.cancel();
        Cancel = axios.CancelToken.source(); // 重新定义cancelToken
    }
    
    
    </script>
    <style scoped>
    .demo-progress .el-progress--line {
        margin-bottom: 15px;
        width: 350px;
    }
    </style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
  • 相关阅读:
    软件系统的测试方法
    我发现了计算机专业,能拉开很大差距的方式,计算机大一新生必看!
    QSqlTableModel使用简介
    windows局域网传文件5种常用方法
    springboot rabbitmq
    开发1-5年的Java程序员,该学习哪些知识实现涨薪30K?
    c++文件服务器相关知识点记录-1
    软件测试学习-黑马程序员,软件测试学习大纲
    【Python】函数式编程
    从 iPhone 人像模式导出深度图(视差图)
  • 原文地址:https://blog.csdn.net/code_feien/article/details/133161603