【OBS】SpringBoot + Vue + el-upload 通过临时 URL 上传文件到 OBS

news/2024/11/29 8:00:40/

华为云OBS的官方文档(链接:https://support.huaweicloud.com/sdk-java-devg-obs/obs_21_0901.html#section1)中关于上传文件的内容,只提供了使用JAVA获取临时上传链接,并使用JAVA创建请求上传纯文本的方法。想要把这部分内容应用到 SpringBoot + Vue + ElementUI/Element-Plus 中,还差很多东西。

文章目录

  • 0 前提条件
  • 1 OBS 桶创建和配置
    • 1.1 华为云OBS桶的创建
    • 1.2 配置桶允许跨域请求
    • 1.3 获取桶信息
  • 2 SpringBoot 后端配置
    • 2.1 依赖
    • 2.2 application.properties 配置
    • 2.3 工具类
    • 2.4 Controller
  • 3 Vue 前端配置
    • 3.1 Vue 组件
    • 3.2 upload API
    • 3.3 request.js

0 前提条件

请先确保SpringBoot、Vue、ElementUI/Element-Plus、axios 等工具安装和配置正确

笔者使用环境:SpringBoot 3.1.0, Vue 3, Element-Plus
SpringBoot 2.7 和 Vue 2 按理不会有很大区别,如有需要请自行调整代码

1 OBS 桶创建和配置

1.1 华为云OBS桶的创建

可参考如下配置
在这里插入图片描述

1.2 配置桶允许跨域请求

可参考官方文档:https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0201.html

其中允许的来源设置为 * 即允许所有跨域请求,也可按如下设置,仅允许当前本地前端访问,其中 8080 为 Vue 前端端口:

http://localhost:8080
http://127.0.0.1:8080

补充头域 可留空

1.3 获取桶信息

后边需要用到的信息有:bucketName、accessKeyId、securitAccessKey、endPoint

bucketName: 本文1.1中创建桶时自定义的桶名称;
accessKeyId 和 securitAccessKey: 参考官方文档https://support.huaweicloud.com/usermanual-ca/zh-cn_topic_0046606340.html;
endPoint:参考下图
在这里插入图片描述

2 SpringBoot 后端配置

2.1 依赖

        <dependency><groupId>com.huaweicloud</groupId><artifactId>esdk-obs-java</artifactId>  <!-- 华为云依赖 --><version>3.22.12</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>  <!-- log日志 --><optional>true</optional></dependency>

2.2 application.properties 配置

application.properties 添加如下配置,值为本文1.3获取的桶信息

huaweicloud.obs.accessKey=
huaweicloud.obs.securityKey=
huaweicloud.obs.endPoint=
huaweicloud.obs.bucketName=
huaweicloud.obs.path =

2.3 工具类

com.gabriel.docsharing.utils 创建如下工具类:

package com.gabriel.docsharing.utils;import com.obs.services.ObsClient;
import com.obs.services.model.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.Map;@Slf4j
@Component
public class HuaweiOBS {@Value("${huaweicloud.obs.accessKey}")private String ak;@Value("${huaweicloud.obs.securityKey}")private String sk;@Value("${huaweicloud.obs.bucketName}")private String bucketName;@Value("${huaweicloud.obs.endPoint}")private String endpoint;// 文件目录private final String prifix = "/test";/*** 获取上传地址** @param fileName 文件名称* @param fileType 文件路径* @return*/public String getUploadUrl(String fileName, FileType fileType) {try {// 创建ObsClient实例ObsClient obsClient = new ObsClient(ak, sk, endpoint);// URL有效期,3600秒long expireSeconds = 3600L;Map<String, String> headers = new HashMap<String, String>();headers.put("Content-Type", "application/octet-stream");String objectName = fileType.getType().concat("/").concat(fileName);TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.PUT, expireSeconds);request.setBucketName(bucketName);request.setObjectKey(objectName);request.setHeaders(headers);TemporarySignatureResponse response = obsClient.createTemporarySignature(request);return response.getSignedUrl();} catch (Exception e) {log.error("获取上传地址异常:{}", e.getMessage(), e);}return null;}public enum FileType {TEST("test", "测试"),PDF("pdf","PDF文件");private String type;private String desc;FileType(String type, String desc) {this.type = type;this.desc = desc;}public String getType() {return type;}public String getDesc() {return desc;}}
}

2.4 Controller

com.gabriel.docsharing.controller 创建如下 Controller:

package com.gabriel.docsharing.controller;import com.gabriel.docsharing.utils.HuaweiOBS;
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;/***  前端控制器* * @author Gabriel* @since 2023-06-08*/
@Log
@RestController
@RequestMapping("/doc")
public class DocController {@AutowiredHuaweiOBS huaweiOBS;@RequestMapping(value = "/getUploadUrl", method = RequestMethod.GET)public String getUploadUrl(String filename){String url = huaweiOBS.getUploadUrl(filename, HuaweiOBS.FileType.TEST);log.info("get upload url, filename: "+ filename + " result: " + url);return url;}
}

3 Vue 前端配置

3.1 Vue 组件

创建 Upload.vue 文件(请自行设置路由),内容如下:

<template><el-upload class="upload" ref="upload" drag:http-request="uploadAction":limit="1":auto-upload="false":on-change="fileChange":on-exceed="handleExceed"><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div></el-upload><el-button @click="submitForm">上传</el-button>
</template><script>
import {genFileId} from "element-plus";
import {useUploadApi} from "@/api/upload";export default {name: "Upload",data() {return {uploadUrl: ''}},methods: {fileChange(file) {  // 上传文件发生变化时,根据新文件获取上传链接if (!this.checkDoc(file)) {this.$refs.upload.clearFiles();} else {useUploadApi().getUploadUrl(file.name).then((res) => {this.uploadUrl = res;});}},handleExceed(files) {  // 上传第二个文件时,覆盖第一个文件if (this.checkDoc(files[0])) {this.$refs.upload.clearFiles()let file = files[0]file.uid = genFileId()this.$refs.upload.handleStart(file)}},checkDoc(file) {// 文件大小和格式检查// let index = file.name.lastIndexOf(".");// let extension = file.name.substr(index + 1);// let extensionList = ["jpeg"];// const isLt2M = file.size / 1024 / 1024 < 1;// if (!isLt2M) {//   ElMessage.error("文件不可超出1M");//   return false;// } else if (extensionList.indexOf(extension) < 0) {//   ElMessage.error("当前文件格式不支持");//   return false;// } else {//   return true;// }return true;},submitForm() {  // 提交上传this.$refs.upload.submit();},uploadAction(param){  // 提交时的自定义上传配置useUploadApi().uploadFile(this.uploadUrl, param.file).then(res=>{alert("上传完成,请在检查中查看返回状态")})},},
}
</script>

3.2 upload API

创建 api/upload/index.js 文件,内容如下:

import request from '@/utils/request';/*** 上传文件api接口集合* @method signIn 用户登录* @method signOut 用户退出登录*/
export function useUploadApi() {return {getUploadUrl: (filename) => {return request({url: '/api/doc/getUploadUrl?filename=' + filename,method: 'get'});},uploadFile: (url, file) => {return request({url: url,method: 'put',headers:{'Content-Type': 'application/octet-stream'},data: file});}};
}

3.3 request.js

创建 utils/request.js 文件,内容如下:

import axios from 'axios';// 创建 axios 实例
const service = axios.create({baseURL: process.env.VUE_APP_BASE_API,timeout: 50000,
});export default service;

http://www.ppmy.cn/news/473916.html

相关文章

复杂日期转换,获取上一个月的起始日期与结束日期

Calendar calendar Calendar.getInstance(); calendar.add(Calendar.MONTH, -1); // 设置日期为当前日期 calendar.setTime(calendar.getTime()); // 将日期设置为该月的第一天 calendar.set(Calendar.DAY_OF_MONTH, 1); // 获取本月的开始时间 Date startTime calendar.getT…

计算机睡眠断网,win7睡眠不断网设置方法汇总

方法一、 运行注册表编辑&#xff0c;依次进入HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Power&#xff0c;然后在右侧窗口空白处单击鼠标右键&#xff0c;新建一个“DWORD32位”的值&#xff0c;并命名为“AwayModeEnabled”&#xff0c;双击给该键…

关闭笔记本计算机盖无法睡眠,如何让win7笔记本关盖不睡眠

很多用户在使用win7系统笔记本电脑的时候&#xff0c;经常会碰到这样一个问题&#xff0c;就是当把笔记本的盖子盖下来的时候&#xff0c;电脑就会进入到睡眠状态了&#xff0c;这样就会导致网络断开&#xff0c;一些软件也会停止运行&#xff0c;那么如果在下载一些东西的话也…

计算机睡眠时间 win7,技术编辑帮你win7系统设置计算机睡眠时间的详细解法

或许有朋友在使用电脑工作的时候&#xff0c;遇到过win7系统设置计算机睡眠时间的情况&#xff0c;还有很多朋友不知道win7系统设置计算机睡眠时间的情况如何处理&#xff0c;针对这一问题&#xff0c;我给大家整理总结出了win7系统设置计算机睡眠时间的具体解决步骤&#xff0…

win7计算机睡眠怎么设置方法,win7系统更改(设置)计算机睡眠时间的操作方法...

很多小伙伴都遇到过对win7系统更改(设置)计算机睡眠时间进行设置的困惑吧&#xff0c;一些朋友看过网上对win7系统更改(设置)计算机睡眠时间设置的零散处理方法&#xff0c;并没有完完全全明白win7系统更改(设置)计算机睡眠时间是如何设置的&#xff0c;今天小编准备了简单的操…

计算机 无法进入睡眠模式,win7电脑无法正常进入睡眠模式怎么办

番茄花园win7系统睡眠模式是电脑处于待机状态下的一种模式&#xff0c;可以通过电脑“电源选项”菜单进行设置&#xff0c;一定程度上节约电源。一般长时间没动电脑就会进入睡眠模式&#xff0c;如果遇到无法正常进入睡眠模式该如何解决&#xff1f;不要着急&#xff0c;我们直…

win7系统没有计算机睡眠状态,如何解决win7系统无法进入睡眠状态

在我们使用电脑的时候一般要是一段时间没有去动电脑又不想繁琐的去开机的话&#xff0c;就会给电脑设置睡眠状态来节约电源&#xff0c;这样可以增加电脑使用的寿命&#xff0c;想必有很多的朋友们在安装了win7系统之后&#xff0c;会遇到系统没法进入睡眠的状态的情况吧&#…

win7计算机无法远程桌面连接,解决win7无法被远程桌面连接教程

很多小伙伴平时工作中都需要连接远程桌面&#xff0c;不过有win7用户反映&#xff0c;远程桌面无法连接该怎么办&#xff1f;下面是小编分享的win7无法被远程桌面连接解决教程&#xff0c;希望能帮助到大家。 1、给win7电脑的用户账户设置一个密码(由于有些版本的远程桌面连接不…