当前位置: 首页 > article >正文

【文件上传】阿里云对象存储服务实现文件上传

一、基础

在这里插入图片描述
在这里插入图片描述
上传到本地:

package org.example.controller;import lombok.extern.slf4j.Slf4j;
import org.example.pojo.Result;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@RestController
@RequestMapping("/upload")
@Slf4j
public class FileUploadController {@PostMappingpublic Result<String> upload(MultipartFile file) throws IOException {//把文件的内容存储到本地磁盘String originalFilename = file.getOriginalFilename();//保证文件名字唯一,防止覆盖UUIDString fileName =  UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));file.transferTo(new File("C:\\Users\\Arata\\Desktop\\file\\" + fileName));return Result.success("url访问地址...");}
}

上传图片大小超过最大限制,修改yml文件:

spring:servlet:multipart:max-file-size: 50MBmax-request-size: 50MBserver:tomcat:max-swallow-size: 10MB

阿里云对象存储OSS (Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。
第三方服务的通用思路:
在这里插入图片描述
在这里插入图片描述

二、创建bucket

在这里插入图片描述
此时需要开启允许读权限,所以需要关闭阻止公共访问,无法修改!那么先完成创建,后进入bucket去进行修改:
在这里插入图片描述

在这里插入图片描述
修改完成后如下:
在这里插入图片描述
此时再修改读写权限(点击设置,并将权限修改为公共读):
在这里插入图片描述

三、获取AccessKey

点击头像,找到AccessKey管理
在这里插入图片描述
在这里插入图片描述
点击创建AccessKey之后,验证身份,后生成AccessKeyIdAccessKeySecret(只生成一次,注意保存好)
在这里插入图片描述

在这里插入图片描述

四、参考官方SDK编写入门程序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
https://help.aliyun.com/zh/oss/developer-reference/getting-started?spm=a2c4g.11186623.help-menu-31815.d_5_2_1_0.1d8d64femaflJE#0cf90ff8b28eg
由文档可以获得:
①导入阿里云坐标:

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>

②上传文件:对象/文件——>上传文件——>简单上传

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.File;public class Demo {public static void main(String[] args) throws Exception {// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 填写Bucket名称,例如examplebucket。String bucketName = "examplebucket";// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。String objectName = "exampledir/exampleobject.txt";// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。String filePath= "D:\\localpath\\examplefile.txt";// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。String region = "cn-hangzhou";// 创建OSSClient实例。ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        OSS ossClient = OSSClientBuilder.create().endpoint(endpoint).credentialsProvider(credentialsProvider).clientConfiguration(clientBuilderConfiguration).region(region)               .build();try {// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));// 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。// 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();}}}
}  

五、集成改造

改造成工具类 AliOssUtil.class

package com.itheima.bigeventadmin.utils;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;import java.io.InputStream;public class AliOssUtil {private static final String ENDPOINT = "https://oss-cn-beijing.aliyuncs.com";private static final String ACCESS_KEY_ID = "LTAI5tQ8e13igWZUMTjMEEQV";private static final String SECRET_ACCESS_KEY = "MffMJoM24sc59SEBEJQDb0cfBVOAC9";private static final String BUCKET_NAME = "big-event-gwd";//上传文件,返回文件的公网访问地址public static String uploadFile(String objectName, InputStream inputStream){// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(ENDPOINT,ACCESS_KEY_ID,SECRET_ACCESS_KEY);//公文访问地址String url = "";try {// 创建存储空间。ossClient.createBucket(BUCKET_NAME);ossClient.putObject(BUCKET_NAME, objectName, inputStream);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();}}return url;}
}

六、调用工具类

    @PostMappingpublic Result<String> upload(MultipartFile file) throws Exception {//把文件的内容存储到本地磁盘String originalFilename = file.getOriginalFilename();//保证文件名字唯一,防止覆盖UUIDString fileName =  UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//file.transferTo(new File("C:\\Users\\Arata\\Desktop\\file\\" + fileName));String url = AliOssUtil.uploadFile(fileName, file.getInputStream());return Result.success(url);}

测试结果:
在这里插入图片描述
在这里插入图片描述

相关文章:

【文件上传】阿里云对象存储服务实现文件上传

一、基础 上传到本地&#xff1a; package org.example.controller;import lombok.extern.slf4j.Slf4j; import org.example.pojo.Result; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; imp…...

IPv6代理如何引领下一代网络未来

随着互联网技术的不断发展&#xff0c;IPv6逐渐成为下一代网络协议的核心&#xff0c;替代IPv4已是大势所趋。IPv6代理作为IPv6网络环境下的重要工具&#xff0c;为用户提供了更高效、更安全的网络解决方案。 IPv6代理的定义 IPv6代理是在IPv6网络环境中为处理IPv4转换和其他网…...

Linux——数据链路层

1. 认识以太网 认知&#xff1a;以太网是用于局域网数据通信的协议标准&#xff0c;定义了同一局域网内通过电缆/无线怎么在设备之间传输数据帧。 注&#xff1a;整个网络世界可以具象看出由许许多多的局域网组成&#xff0c; • 家庭中的设备A and 家庭中的设备B and 家庭路由…...

ubuntu 22.04 安装下载

ubuntu 22.04下载安装及相关配置_ubuntu22.04下载-CSDN博客...

深度学习面试八股简略速览

在准备深度学习面试时&#xff0c;你可能会感到有些不知所措。毕竟&#xff0c;深度学习是一个庞大且不断发展的领域&#xff0c;涉及众多复杂的技术和概念。但别担心&#xff0c;本文将为你提供一份全面的指南&#xff0c;从基础理论到实际应用&#xff0c;帮助你在面试中脱颖…...

【深度学习-pytorch篇】1. Pytorch矩阵操作与DataSet创建

Pytorch矩阵操作与DataSet创建 1. Python 环境配置 1.1 安装 Anaconda 推荐使用 Anaconda 来管理 Python 环境&#xff0c;访问官网下载安装&#xff1a; https://www.anaconda.com/download/success 1.2 安装 PyTorch 请根据自己的系统平台&#xff08;Windows/Linux/ma…...

游戏引擎学习第310天:利用网格划分完成排序加速优化

回顾并为今天的内容做个铺垫 昨天我们完成了一个用于排序的空间划分系统&#xff0c;但还没有机会真正利用它。昨天的工作刚好在结束时才完成&#xff0c;所以今天我们打算正式使用这个空间划分来加速排序。 现在我们在渲染代码中&#xff0c;可以看到在代码底部隐藏着一个“…...

数据结构 - 树的遍历

一、二叉树的遍历 对于二叉树&#xff0c;常用的遍历方式包括&#xff1a;先序遍历、中序遍历、后序遍历和层次遍历 。 1、先序遍历&#xff08;PreOrder&#xff09; 先序遍历的操作过程如下&#xff1a; 若二叉树为空&#xff0c;则什么也不做&#xff1b;否则&#xff0…...

时序模型介绍

一.整体介绍 1.单变量 vs 多变量时序数据 单变量就是只根据时间预测&#xff0c;多变量还要考虑用户 2.为什么不能用机器学习预测&#xff1a; a.时间不是影响标签的关键因素 b.时间与标签之间的联系过于弱/过于复杂&#xff0c;因此时序模型依赖于时间与时间的相关性来进行预…...

Java面试实战:从Spring到大数据的全栈挑战

Java面试实战&#xff1a;从Spring到大数据的全栈挑战 在某家知名互联网大厂&#xff0c;严肃的面试官正在面试一位名叫谢飞机的程序员。谢飞机以其搞笑的回答和对Java技术栈的独特见解而闻名。 第一轮&#xff1a;Spring与微服务的探索 面试官&#xff1a;“请你谈谈Spring…...

解决idea与springboot版本问题

遇到以下问题&#xff1a; 1、springboot3.2.0与jdk1.8 提示这个包org.springframework.web.bind.annotation不存在&#xff0c;但是pom已经引入了spring-boot-starter-web 2、Error:Cannot determine path to tools.jar library for 17 (D:/jdk17) 3、Error:(3, 28) java: …...

【第4章 图像与视频】4.4 离屏 canvas

文章目录 前言为什么要使用 offscreenCanvas为什么要使用 OffscreenCanvas如何使用 OffscreenCanvas第一种使用方式第二种使用方式 计算时长超过多长时间适合用Web Worker 前言 在 Canvas 开发中&#xff0c;我们经常需要处理复杂的图形和动画&#xff0c;这些操作可能会影响页…...

[AXI]如何验证AXI5原子操作

如何验证 AXI5 原子操作 摘要&#xff1a;在 UVM (Universal Verification Methodology) 验证环境中&#xff0c;验证 AXI5 协议的原子操作 (Atomic Operations) 是一项重要的任务&#xff0c;特别是在验证支持高并发和数据一致性的 SoC (System on Chip) 设计时。AXI5 引入了原…...

尚硅谷redis7 74-85 redis集群分片之集群是什么

74 redis集群分片之集群是什么 如果主机宕机&#xff0c;那么写操作就被暂时中断&#xff0c;后面就要由哨兵进行投票和选举。那么一瞬间若有大量的数据修改&#xff0c;由于写操作中断就会导致数据流失。 由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行…...

Android获取设备信息

使用java: List<TableMessage> dataListnew ArrayList<TableMessage>();//获取设备信息Hashtable<String,String> ht MyDeviceInfo.getDeviceAllInfo2(LoginActivity.this);for (Map.Entry<String, String> entry : ht.entrySet()) {String key entry…...

WPF的基础控件:布局控件(StackPanel DockPanel)

布局控件&#xff08;StackPanel & DockPanel&#xff09; 1 StackPanel的Orientation属性2 DockPanel的LastChildFill3 嵌套布局示例4 性能优化建议5 常见问题排查 在WPF开发中&#xff0c;布局控件是构建用户界面的基石。StackPanel和DockPanel作为两种最基础的布局容器&…...

apache的commons-pool2原理与使用详解

Apache Commons Pool2 是一个高效的对象池化框架&#xff0c;通过复用昂贵资源&#xff08;如数据库连接、线程、网络连接&#xff09;优化系统性能。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击…...

打印Yolo预训练模型的所有类别及对应的id

有时候我们可能只需要用yolo模型检测个别类别&#xff0c;并显示&#xff0c;这就需要知道id&#xff0c;以下代码可打印出 from ultralytics import YOLO# 加载模型 model YOLO(yolo11x.pt)# 打印所有类别名称及其对应的ID print(model.names) {0: person, 1: bicycle, 2: c…...

语法糖介绍(C++ Python)

语法糖&#xff08;Syntactic Sugar&#xff09;是编程语言中为了提升代码可读性和简洁性而设计的语法结构。它不改变语言的功能&#xff0c;但能让代码更易写和理解。以下是 C 和 Python 中常见的语法糖示例&#xff1a; C 中的常见语法糖 范围 for 循环&#xff08;Range-bas…...

事务详解及面试常考知识点整理

事务详解及面试常考知识点整理 1. 什么是事务&#xff1f; **事务&#xff08;Transaction&#xff09;**是将多条 SQL 语句打包执行的操作单元&#xff0c;具有“一气呵成”的特性。就好比你要完成“把大象放进冰箱”这件事&#xff0c;一共分三步&#xff1a; 打开冰箱门把…...

设计模式26——解释器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 解释器模式&#xff08;Interp…...

在MDK中自动部署LVGL,在stm32f407ZGT6移植LVGL-8.3,运行demo,显示label

在MDK中自动部署LVGL&#xff0c;在stm32f407ZGT6移植LVGL-8.3 一、硬件平台二、实现功能三、移植步骤1、下载LVGL-8.42、MDK中安装LVGL-8.43、配置RTE4、配置头文件 lv_conf_cmsis.h5、配置lv_port_disp_template 四、添加心跳相关文件1、在STM32CubeMX中配置TIM7的参数2、使能…...

ArcGIS 与 HEC-RAS 协同:流域水文分析与洪水模拟全流程

技术点目录 洪水淹没危险性评价方法及技术介绍基于ArcGIS的水文分析基于HecRAS淹没模拟的洪水危险性评价洪水风险评价综合案例分析应用了解更多 —————————————————————————————————————————————————— 前言综述 洪水危险性及…...

树莓派设置静态ip 永久有效 我的需要设置三个 一个摄像头的 两个设备的

通过 systemd-networkd 配置 此方法适用于较新的Raspberry Pi OS版本&#xff0c;支持同时绑定多个IP地址到同一网卡&#xff0c;且配置清晰稳定。 1.禁用DHCP客户端对eth0的管理:编辑/etc/dhcpcd.conf文件&#xff0c;添加以下内容以忽略eth0接口的自动分配 sudo nano /etc…...

多模态大语言模型arxiv论文略读(九十九)

PartGLEE: A Foundation Model for Recognizing and Parsing Any Objects ➡️ 论文标题&#xff1a;PartGLEE: A Foundation Model for Recognizing and Parsing Any Objects ➡️ 论文作者&#xff1a;Junyi Li, Junfeng Wu, Weizhi Zhao, Song Bai, Xiang Bai ➡️ 研究机构…...

Fine-tuning:微调技术,训练方式,LLaMA-Factory,ms-swift

1&#xff0c;微调技术 特征Full-tuningFreeze-tuningLoRAQLoRA训练参数量全部少量极少极少显存需求高低很低最低模型性能最佳中等较好接近 LoRA模型修改方式无变化局部冻结插入模块量化插入模块多任务共享不便较便非常适合非常适合适合超大模型微调❌✅✅✅&#xff08;最优&…...

vscode连接的linux服务器,上传项目至github

问题 已将项目整个文件夹拷贝到克隆下来的文件夹中&#xff0c;并添加了所有文件&#xff0c;并修改了commit -m&#xff0c;使用git push -u origin main提交的时候会出现vscode请求登录github&#xff0c;确定之后需要等待很久&#xff0c;也无果 原因 由于 远程服务器无法…...

XCTF-web-mfw

发现了git 使用GitHack下载一下源文件&#xff0c;找到了php源代码 <?phpif (isset($_GET[page])) {$page $_GET[page]; } else {$page "home"; }$file "templates/" . $page . ".php";// I heard .. is dangerous! assert("strpos…...

indel_snp_ssr_primer

indel标记使用 1.得到vcf文件 2.提取指定区域vcf文件并压缩构建索引 bcftools view -r <CHROM>:<START>-<END> input.vcf -o output.vcf bgzip -c all.filtered.indel.vcf > all.filtered.indel.vcf.gz tabix -p vcf all.filtered.indel.vcf.gz3.准备参…...

图论核心:深度搜索DFS 与广度搜索BFS

一、深度优先搜索&#xff08;DFS&#xff09;&#xff1a;一条路走到黑的探索哲学 1. 算法核心思想 DFS&#xff08;Depth-First Search&#xff09;遵循 “深度优先” 原则&#xff0c;从起始节点出发&#xff0c;尽可能深入地访问每个分支&#xff0c;直到无法继续时回溯&a…...