文件上传功能(四)——项目集成

news/2025/2/23 1:06:22/

总说

过程参考黑马程序员SpringBoot3+Vue3全套视频教程,springboot+vue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili

目录

总说

一、功能实现

1.1 Controller层

1.2 测试接口


一、功能实现

我们要将入门程序改为一个工具类

utils目录下创建AliOssUtil

将Demo中的代码复制过来

代码如下:

java">    public static void main(String[] args) throws Exception {// 以华东1(杭州)为例,endpoint:是服务器区域节点String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。//EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();String ACCESS_KEY_ID = "LTAI5tRrhg6TFMC9vRnE8PSa";String ACCESS_KEY_SECRET = "d4vDQAycnaNh1oXl6cLgFwXii2uPIV";// 填写Bucket名称String bucketName = "learn-project-test";// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。String objectName = "001.png";// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。String region = "cn-hangzhou";// 使用 DefaultCredentialProvider 或 StaticCredentialsProviderCredentialsProvider credentialsProvider = new DefaultCredentialProvider(ACCESS_KEY_ID, ACCESS_KEY_SECRET);// 创建OSSClient实例。ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);OSS ossClient = OSSClientBuilder.create().endpoint(endpoint).credentialsProvider(credentialsProvider).clientConfiguration(clientBuilderConfiguration).region(region).build();try {// 填写字符串。String content = "Hello OSS,你好世界";// 创建PutObjectRequest对象//这里我们要上传图片,修改为:new FileInputStream("本地磁盘路径")PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new FileInputStream("C:\\Users\\86176\\Desktop\\files\\001.png"));// 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。// ObjectMetadata metadata = new ObjectMetadata();// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());// metadata.setObjectAcl(CannedAccessControlList.Private);// putObjectRequest.setMetadata(metadata);// 上传字符串。PutObjectResult result = ossClient.putObject(putObjectRequest);} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}}

我们发现:endpoint、ACCESS_KEY_ID、ACCESS_KEY_SECRET、bucketName的值不会变,我们设置成全局变量,并修改endpoint、bucketName变量名

java">// 以华东1(杭州)为例,endpoint:是服务器区域节点private static final String ENDPOINT = "https://oss-cn-hangzhou.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。//EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();private static final String ACCESS_KEY_ID = "LTAI5tRrhg6TFMC9vRnE8PSa";private static final String ACCESS_KEY_SECRET = "d4vDQAycnaNh1oXl6cLgFwXii2uPIV";// 填写Bucket名称private static final String BUCKET_NAME = "learn-project-test";

对代码进行修改,修改完的完整代码如下:

java">package com.example.learnproject.utils;import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;import java.io.FileInputStream;
import java.io.InputStream;public class AliOssUtil {// 以华东1(杭州)为例,endpoint:是服务器区域节点private static final String ENDPOINT = "https://oss-cn-hangzhou.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。//EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();private static final String ACCESS_KEY_ID = "LTAI5tRrhg6TFMC9vRnE8PSa";private static final String ACCESS_KEY_SECRET = "d4vDQAycnaNh1oXl6cLgFwXii2uPIV";// 填写Bucket名称private static final String BUCKET_NAME = "learn-project-test";// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。private static final String region = "cn-hangzhou";//设置String类型访问地址,返回图片地址public static String uploadFile(String objectName, InputStream inputStream) throws Exception {// 使用 DefaultCredentialProvider 或 StaticCredentialsProviderCredentialsProvider credentialsProvider = new DefaultCredentialProvider(ACCESS_KEY_ID, ACCESS_KEY_SECRET);// 创建OSSClient实例。ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);OSS ossClient = OSSClientBuilder.create().endpoint(ENDPOINT).credentialsProvider(credentialsProvider).clientConfiguration(clientBuilderConfiguration).region(region).build();// 图片地址,用于返回String url = "";try {// 填写字符串。String content = "Hello OSS,你好世界";// 创建PutObjectRequest对象//这里我们要上传图片,修改为:new FileInputStream("本地磁盘路径")PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, objectName, inputStream);// 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。// ObjectMetadata metadata = new ObjectMetadata();// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());// metadata.setObjectAcl(CannedAccessControlList.Private);// putObjectRequest.setMetadata(metadata);// 上传字符串。PutObjectResult result = ossClient.putObject(putObjectRequest);// url组成:https://bucket名称.区域节点/时间/objectName名称url = "https://" + BUCKET_NAME + "." + ENDPOINT.substring(ENDPOINT.lastIndexOf("/") + 1) + "/" + objectName;} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}}}

1.1 Controller层

来到FileUploadController,我们之前写的静态的,修改代码如下:

java">@RestController
public class FileUploadController {@PostMapping("/upload")public Result<String> upload(MultipartFile file) throws Exception { //MultipartFile file 用来接收上传的文件//把文件的内容存到本地磁盘上String originFilename = file.getOriginalFilename();// 获取原始文件名//保证文件的名字唯一,防止文件名被覆盖//用UUID.randomUUID().toString() 生成一个随机的字符串 + 原始文件名后缀String fileName = UUID.randomUUID().toString() + originFilename.substring(originFilename.lastIndexOf("."));//file.transferTo(new File("C:\\Users\\86176\\Desktop\\files\\" + fileName));//将接收到的文件内容写入到本地磁盘上//第一个参数是String类型的文件路径,第二个参数是File类型的输入流String url = AliOssUtil.uploadFile(fileName, file.getInputStream());return Result.success(url);}
}

1.2 测试接口

来到apifox的稳健上传接口,我们再测试一下,上传一个新的图片

成功上传

上传git保存


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

相关文章

Haskell语言的云计算

Haskell语言与云计算&#xff1a;结合高阶函数与分布式系统的力量 引言 云计算作为现代计算技术的重要组成部分&#xff0c;已经渗透到我们生活的方方面面。随着技术的不断进步&#xff0c;许多编程语言也开始了它们在云计算领域的探索与实践。Haskell作为一种具有强大类型系…

Kafka偏移量管理全攻略:从基础概念到高级操作实战

#作者&#xff1a;猎人 文章目录 前言&#xff1a;概念剖析kafka的两种位移消费位移消息的位移位移的提交自动提交手动提交 1、使用--to-earliest重置消费组消费指定topic进度2、使用--to-offset重置消费offset3、使用--to-datetime策略指定时间重置offset4、使用--to-current…

Java常用工具类详解

目录 一、Java 中的数学利器&#xff1a;java.lang.Math 类详解 1.常用属性 2.常用方法 ⑴.static int abs(int a) ⑵.static double ceil(double a) ⑶.static double floor(double a) ⑷.static int max(int a, int b) 和 static int min(int a, int b) ⑸.static do…

强化学习笔记7——DDPG到TD3

前提&#xff1a;基于TD 的方法多少都会有高估问题&#xff0c;即Q值偏大。原因两个&#xff1a;一、TD目标是真实动作的高估。 二&#xff1a;自举法高估。 DDPG 属于AC方法&#xff1a;异策略&#xff0c;适合连续动作空间&#xff0c;因为他的策略网络直接输出的动作&#…

滴水逆向_新增节

1 本人亲测过了&#xff0c;在win10&#xff0c;win11 下也是可以新增的 2 手动就不演示了&#xff0c; 能够准确地写程序完成新增节并且正常运行。 3 无论是内存对齐&#xff0c;文件对齐 相等还是说不相等都是可以实现的&#xff0c;测试过了。 附上代码&#xff1a; hea…

Python 高级特性

1. 装饰器(Decorators) 用途:动态修改函数/类的行为,常用于日志、权限、缓存等场景。示例:def timer(func):def wrapper(*args, **kwargs):start = time.time()result = func(*args, **kwargs)end = time.time()print(f"{func.__name__} executed in {end - start:.2…

括 号 问题

E-lz的括号问题_牛客小白月赛105 #include <bits/stdc.h> #define int long long using namespace std; string s; vector<vector<int>>f(1000000); signed main() {ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);int n;cin>>n;cin>>s;queue…

Windows环境安装部署minimind步骤

Windows环境安装部署minimind步骤 必要的软件环境 git git&#xff0c;可下载安装版&#xff0c;本机中下载绿色版&#xff0c;解压到本地目录下&#xff08;如&#xff1a;c:\soft\git.win64&#xff09;&#xff0c;可将此路径添加到PATH环境变量中&#xff0c;供其他程序…