阿里云oss文件直传(vue3+element plus+springboot)

发布时间:2022-11-05 09:15:38
修改时间:2024-07-30 09:06:31
总阅读数:1152
今日阅读数:0
昨日日阅读数:0
字数:4201

vue3+element plus文件直传阿里云oss

后端代码(java)

添加依赖

pom.xml
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.15.0</version>
        </dependency>
OssController.java
package com.qc.controller;

import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.net.URL;
import java.util.Date;
import java.util.UUID;

/**
 * @author qc
 * @version 1.0
 * @date 2022/11/03 22:52
 */
@RestController
@RequestMapping("/oss")
public class OssController {

    @Value("${aliOss.endpoint}")
    private String endpoint;
    @Value("${aliOss.accessKeyId}")
    private String accessKeyId;
    @Value("${aliOss.accessKeySecret}")
    private String accessKeySecret;
    @Value("${aliOss.bucketName}")
    private String bucketName;


    /**
     * 获取阿里云oss文件上传链接
     *
     * @return java.lang.String 文件上传链接
     * @author qc
     * @date 2022/11/3 22:52
     */
    @GetMapping("/generatePresignedUrl")
    public String generatePresignedUrlRequest() {
        OSSClientBuilder ossClientBuilder = new OSSClientBuilder();
        OSS oss = ossClientBuilder.build(endpoint, accessKeyId, accessKeySecret);

//        文件名,可自行修改生成方式
        String key = UUID.randomUUID().toString();

//        授权过期时间
        Date expiration = new Date(System.currentTimeMillis() + 1000 * 60 * 24L);

        GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.PUT);
        generatePresignedUrlRequest.setContentType("application/octet-stream");
        generatePresignedUrlRequest.setExpiration(expiration);

        URL url = oss.generatePresignedUrl(generatePresignedUrlRequest);
        return url.toString();
    }


}

前端代码(vue)

request.js
import axios from 'axios'


export default axios
ossApi.js
import request from "@/api/request.js";

export function generatePresignedUrlApi(params) {
    return request({
        url: '/oss/generatePresignedUrl',
        method: 'get',
        params:params,
    })
}

export function ossUploadApi(url,file,progressEvent) {
    return request({
        url: url,
        method: 'put',
        headers: {
            "Content-Type": "application/octet-stream"
        },
        data:file,
        onUploadProgress:progressEvent,
    })
}

Upload.vue
<script setup>

import {generatePresignedUrlApi, ossUploadApi} from "@/api/ossApi.js";
import {Plus} from "@element-plus/icons";
import {ref} from "vue";

const fileList = ref([])

/**
 *
 * @param option
 * @return {XMLHttpRequest}
 */
const handleHttpReq = (option) => {

  generatePresignedUrlApi().then(res => {

    let isSuccess = false

    ossUploadApi(res.data.data, option.file, e => {

      if (!isSuccess) {
        option.onProgress({percent: e.progress * 100})
      }

    }).then(r => {
      isSuccess = true
      option.onProgress({percent: 100})
      option.onSuccess(res.data.data.split("?")[0])
    })

  })

}


const handleSuccess = (response, uploadFile, uploadFiles) => {
  uploadFile.url = response
}

</script>

<template>
  <el-upload
      v-model:file-list="fileList"
      list-type="picture-card"
      :http-request="handleHttpReq"
      :on-success="handleSuccess"
      multiple
  >
    <el-icon>
      <Plus/>
    </el-icon>
  </el-upload>
</template>

<style scoped>

</style>