文件上传,还存储在应用服务器?

article/2025/11/11 16:15:30

前言

一般项目开发中都会有文件、图片、视频等文件上传并能够访问的场景。要实现这样的场景,要么把文件存储在应用服务器上,要么搭建文件服务来存储。但是这两种方式也有不少的缺点,增加运维的成本。

因此,追求用户体验的项目可能会考虑使用第三方的云服务来实现存储,目前市场上主流的厂商有:七牛云、阿里云OSS、腾讯云COS等,具体采用哪种存储方案还需结合项目的规模、成本等因素,综合考量。

因为我的是腾讯云的服务器,所以就直接开通了腾讯云的COS对象存储。这篇文章就来记录一下,SpringBoot整合腾讯云COS对象存储实现文件上传的。


一、准备工作

整合前需要做一些准备工作,开通COS对象存储,创建存储通,创建访问密钥。

1. 开通腾讯云对象存储服务

新用户专享,1米可以购买1年的存储。用来学习还是很香的。console.cloud.tencent.com/cos

2. 创建存储桶

注意存储桶访问的访问权限,设置成公有读私有写。

3. 密钥管理,创建密钥

点击新建密钥,会自动生成。

三、整合步骤

1. 添加maven依赖

代码如下(示例):

<!--腾讯云 COS 对象存储-->
<dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.89</version>
</dependency>
复制代码

2. yml文件增加配置

代码如下(示例):

# 腾讯云cos配置
cos:baseUrl: https://xiliu-******24.cos.ap-guangzhou.myqcloud.comsecretId: AKI******************iorsecretKey: zZ*************z6regionName: ap-guangzhoubucketName: xiliu-******24folderPrefix: /upload
复制代码

3. 新建 COS 配置类

代码如下(示例):

package com.java.xiliu.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** @author xiliu* @description 腾讯云cos对象存储配置类* @date 2022/10/28*/
@Data
@Component
@ConfigurationProperties(prefix = "cos")
public class CosConfig {/*** 存储桶访问路径**/private String baseUrl;/*** 腾讯云账号秘钥**/private String secretId;/*** 密码秘钥**/private String secretKey;/*** 存储桶地区**/private String regionName;/*** 存储桶名称**/private String bucketName;/*** 上传的根目录**/private String folderPrefix;public COSClient getCosClient() {// 初始化用户信息COSCredentials cosCredentials = new BasicCOSCredentials(this.secretId,this.secretKey);// 设置地域Region region = new Region(this.regionName);ClientConfig config = new ClientConfig(region);// 生成COS客户端COSClient client = new COSClient(cosCredentials,config);return client;}
}复制代码

4. 新建 COS 上传工具类

代码如下(示例):

package com.java.xiliu.common.untils.file;import com.java.xiliu.common.untils.SpringUtils;
import com.java.xiliu.config.CosConfig;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.UploadResult;
import com.qcloud.cos.transfer.TransferManager;
import com.qcloud.cos.transfer.Upload;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** @author xiliu* @description 腾讯云COS文件上传工具类* @date 2022/10/31*/
@Slf4j
public class CosClientUtils {/*** 获取配置信息*/private static CosConfig cosConfig = SpringUtils.getBean(CosConfig.class);public static String upload(MultipartFile file, String dir) throws Exception {String originalFilename = file.getOriginalFilename();// 文件名String name = FilenameUtils.getBaseName(originalFilename) + "_" + System.currentTimeMillis() + originalFilename.substring(originalFilename.lastIndexOf("."));// 目录String folderName = cosConfig.getFolderPrefix() + "/" + dir + "/";String key = folderName + name;File localFile = null;try {localFile = transferToFile(file);String filePath = uploadFileToCos(localFile, key);log.info("upload COS successful: {}", filePath);return filePath;} catch (Exception e) {throw new Exception("文件上传失败");} finally {localFile.delete();}}/*** 用缓冲区来创建临时文件* 使用 MultipartFile.transferTo()* @param multipartFile* @return*/private static File transferToFile(MultipartFile multipartFile) throws IOException {String originalFilename = multipartFile.getOriginalFilename();String prefix = originalFilename.split("\\.")[0];String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));File file = File.createTempFile(prefix, suffix);multipartFile.transferTo(file);return file;}/*** 上传文件到COS* @param localFile* @param key* @return*/private static String uploadFileToCos(File localFile, String key) throws InterruptedException {PutObjectRequest putObjectRequest = new PutObjectRequest(cosConfig.getBucketName(), key, localFile);// 获取连接COSClient cosClient = cosConfig.getCosClient();// 创建线程池ThreadPoolExecutor threadPool = new ThreadPoolExecutor(8, 16,4, TimeUnit.SECONDS, new ArrayBlockingQueue(10), new ThreadPoolExecutor.AbortPolicy());// 传入一个threadPool, 若不传入线程池, 默认TransferManager中会生成一个单线程的线程池TransferManager transferManager = new TransferManager(cosClient, threadPool);// 返回一个异步结果Upload, 可同步的调用waitForUploadResult等待upload结束, 成功返回UploadResult, 失败抛出异常Upload upload = transferManager.upload(putObjectRequest);UploadResult uploadResult = upload.waitForUploadResult();transferManager.shutdownNow();cosClient.shutdown();String filePath = cosConfig.getBaseUrl() + uploadResult.getKey();return filePath;}
}复制代码

5. 新建 Controller 上传接口

代码如下(示例):

    @ApiOperation(value = "用户头像上传")@PostMapping("/profile/avatar")public R uploadAvatar(@RequestParam("avatarfile") MultipartFile file) throws Exception {if (!file.isEmpty()) {String avatar = CosClientUtils.upload(file, "avatar");return R.ok(avatar);}return R.error("上传头像异常,请联系管理员");}
复制代码

6. 测试

使用 Swagger 接口文档或者Postman测试上传接口,成功返回地址。使用浏览器打开该返回地址,可以正常预览。


总结

以上就是本文的全部内容了,感谢大家的阅读。

如果觉得文章对你有帮助,还不忘帮忙点赞、收藏、关注、评论哟,您的支持就是我创作最大的动力!


http://chatgpt.dhexx.cn/article/fWZdsoIS.shtml

相关文章

Linux文件服务NFS共享存储服务

&#x1f618;作者简介&#xff1a;一名99年运维岗位员工&#xff0c;正在自学云计算课程。&#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。&#x…

云服务器 能存储文件吗,云服务器存储文件

云服务器存储文件 内容精选 换一换 外部镜像文件在从原平台导出前&#xff0c;没有按照“Windows操作系统的镜像文件限制”的要求完成初始化操作&#xff0c;推荐您使用弹性云服务器完成相关配置。流程如图1所示。云服务器的正常运行依赖于XEN Guest OS driver(PV driver)和KVM…

Java -- OSS对象存储服务(Object Storage Service,简称 OSS)文件服务器

一个成熟的技术架构要有一定的分离性&#xff0c; 平台级的产品一般会这么分&#xff1a;应用服务器、数据库服务器、文件服务器。一般文件、数据库、应用服务器&#xff0c;都应该做逻辑和物理的分离。 以前我们想要做文件上传可能要自己去搭建一个专门的服务器&#xff0c;然…

文件服务器存储解决方案探索

1 定义 文件服务器(file servers)是一种器件&#xff0c;它的功能就是向服务器提供文件。 它加强了存储器的功能&#xff0c;简化了网络数据的管理。 它一则改善了系统的性能&#xff0c;提高了数据的可用性&#xff0c;二则减少了管理的复杂程度&#xff0c;降低了运营费用。…

SeaWeedFS文件存储服务器搭建

概述 seaweedfs是一个非常优秀的由 golang 开发的分布式存储开源项目。它是用来存储文件的系统&#xff0c;并且与使用的语言无关&#xff0c;使得文件储存在云端变得非常方便。 对应的流程图如下&#xff1a; 同步过程 流程图如下 下载过程 流程图如下 在逻辑上Seaweedfs的几…

免费文件服务器储存技术

当今的云存储技术发展飞快&#xff0c;NAS、网盘、FTP等技术不断升级。对于企业来说&#xff0c;有大量的企业管理信息需要存储&#xff0c;拿网站的上网记录来说&#xff0c;按照安全规定网站需存储用户六个月的上网浏览记录数据&#xff0c;需要专业的NAS、网盘、FTP来进行存…

文件储存服务器推荐,文件储存服务器

文件储存服务器 内容精选 换一换 登录Windows操作系统的弹性云服务器时&#xff0c;需使用密码方式登录。因此&#xff0c;用户需先根据创建弹性云服务器时使用的密钥文件&#xff0c;获取该弹性云服务器初始安装时系统生成的管理员密码(Administrator帐户或Cloudbase-init设置…

文件云存储服务器(文件、图片)

文件云服务器 七牛云 public class TestQiniu {// 上传本地文件Testpublic void uploadFile(){//构造一个带指定Zone对象的配置类Configuration cfg new Configuration(Zone.zone0());//...其他参数参考类注释UploadManager uploadManager new UploadManager(cfg);//...生成上…

服务器存储

服务器存储 前言一、开放系统的存储简介1.DAS2.NAS3.SAN4.直连式存储&#xff08;DAS&#xff09;和网络存储&#xff08;NAS、SAN&#xff09;的区别NAS和SAN的区别 二、存储接口简介 前言 存储架构根据服务器类型分为 1、封闭系统的存储&#xff08;此处的封闭系统可理解为一…

Windows Server存储空间配置及文件服务器的搭建

Windows Server存储空间配置及文件服务器的搭建 ❇️技术参考&#xff1a; 存储空间配置及文件服务器的搭建.pdf &#x1f310;一、网络拓扑图 ⚒️环境准备 基础环境级上次实验结束后环境&#xff1a;上次实验 这里的共享存储就使用DC服务器 基础环境的准备&#xff1a; …

Linux根目录结构介绍(FHS文件系统)

目录 1、bin&#xff08;/usr/bin&#xff09; 目录 2、boot目录 3、dev 目录 3.1、/dev/console 3.2、/dev/zero 3.3、/dev/null 3.4、/dev/random 和 /dev/urandom 3.5、/dev/sr0 3.6、/dev/null 4、etc 目录 4.1、/etc/hostname 4.2、/etc/hosts 4.3、/etc/fst…

Linux目录结构简述

一、 Linux概述 Linux是一款开源的操作系统&#xff0c;继承Unix以网络为核心的设计思想&#xff0c;是一个多用户的网络操作系统。 二、Linux文件和目录结构 1、Linux文件 在Linux操作系统里&#xff0c;一切皆文件。 2、Linux目录结构 Linux目录结构简介&#xff1a; ①/…

Linux目录结构与功能——详解

目录 Linux 系统目录结构 Linux 系统目录结构的功能 Linux 系统目录结构 1.查看目录结构的命令 ls / 2.树状目录结构 3.文件或目录的表达方法 在 Linux 或 Unix 操作系统中&#xff0c;所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构。 文件系统的最顶层是由…

Linux目录结构及其内容

Linux目录结构及其内容 在早期的UNIX系统中&#xff0c;关于某个文件应该放在哪个目录下的问题&#xff0c;各个发行版都有自己的观点。为了避免产生混乱&#xff0c;在Linux面世不久后就开始了对Linux文件系统的标准活动。Linux文件系统标准FSSTND于1994年推出&#xff0c;之…

【Linux】-Linux目录结构及文件基本操作

Linux目录结构及文件基本操作 Ⅰ Linux目录与Windows目录の差异Ⅱ Linux目录——FHS标准Ⅲ 目录路径A. 切换路径B. 绝对路径C. 相对路径 Ⅳ 文件基本操作A. 新建a. 新建空白文件b. 新建目录 B. 复制a. 复制文件b. 复制目录 C. 删除a. 删除文件b. 删除目录 D. 移动文件&文件…

Linux目录结构的功能

1、文件目录的含义&#xff1a; 1.1、/bin/与/sbin/&#xff1a;bin代表的普通用户使用的命令&#xff1b;/sbin/代表root管理员用户使用的命令。 1.2、/root/与/home/&#xff1a;/root/代表管理员的家目录&#xff1b;/home/代表普通用户的家目录。 1.3、/ues/&#xff1a…

Linux目录结构全解(非常详细)

1. 树状目录结构图 2. /目录说明 目录星级描述/★★★★★第一层次结构的根、整个文件系统层次结构的根目录。/bin★★★★★常用的二进制命令所在的目录,如:ls,cp,mkdir rm等命令. /bin目录和usr/bin类似/boot★★★1. Linux的内核以及引导系统程序所需的文件目录 ; 2.是启动…

Linux目录结构和文件命令

前言&#xff1a;Hello! 我是每天都要敲代码&#xff01;目前在和比特蛋哥重温一下Linux基础&#xff1b;毕竟每个大佬讲的课都有一些不同&#xff1b;虽然蛋哥的课程很少&#xff0c;但是干货也挺多的&#xff0c;等跟着蛋哥学习完这些课&#xff0c;就再更新一些我以前所学的…

【详细】Linux目录结构

1、基本介绍 Linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层结构是根目录 “/”&#xff0c;然后在此目录下再创建其他的目录。 在Linux世界里&#xff0c;一切皆文件。 2、目录树的具体介绍 &#xff08;1&#xff09;/ 根目录 根目录 “/” 处在…

Linux目录结构及目录存放详细解释

原文链接&#xff1a;Linux系统下的目录树结构_yimisiyang-CSDN博客_linux目录树结构 FHS标准 FHS标准全称是Filesystem Hierarchy Standard,其目的是希望用户可以了解到已安装软件通常放置在哪个目录下面&#xff0c;因此希望独立的软件开发商、操作系统制作者、维护系统的用…