JAVA开发(腾讯云OSS图片上传)

这篇具有很好参考价值的文章主要介绍了JAVA开发(腾讯云OSS图片上传)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求背景:

项目中需要上传图片。

存储方式:

使用腾讯云的OSS组件。

代码实现:

1、使用腾讯云OSS需要使用的参数信息:

OSS的域名;

OSS的地域节点;

OSS存储桶的名称;

OSS权限凭证;

OSS权限访问秘钥;

OSS图片存储策略;

使用的缩略图策略;

允许上传的图片类型;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;


@Data
@Component
@ConfigurationProperties(prefix = "oss.tencent")
public class TencentProperties {
	
    /**域名*/
    private String domain;
    /**地域节点*/
    private String region;
    /**存储桶名称*/
    private String bucketName;
    /**secretId*/
    private String secretId;
    /**secretKey*/
    private String secretKey;
    /**图片策略*/
    private String styleRule;
    /**缩略图策略*/
    private String thumbnailStyleRule;
    /**文件类型*/
    private List<String> fileTypes;
}

参数yml文件或者通过配置中心进行配置

oss:
  tencent:
    domain:
    region: ap-XXX
    bucketName: XXX
    secretId: XXXXXX
    secretKey: XXXXXX
    styleRule:
    thumbnailStyleRule: "!Photo_Compression"
    fileTypes: ## 允许上传的文件类型
        - png
        - jpg
        - jpeg
        - gif
        - bmp
        - svg

2、上传图片操作工具类service

import java.io.InputStream;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.UploadResult;
import com.qcloud.cos.region.Region;
import com.qcloud.cos.transfer.TransferManager;
import com.qcloud.cos.transfer.TransferManagerConfiguration;
import com.qcloud.cos.transfer.Upload;


import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Assert;
import lombok.extern.slf4j.Slf4j;

 
@Slf4j
@Component("tencent")
public class TencentFileHandle implements FileStrategy {

    @Autowired
    TencentProperties tencentProperties;


    // 创建 COSClient 实例,这个实例用来后续调用请求
    COSClient createCOSClient() {
        // 设置用户身份信息。
        // SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
        String secretId = tencentProperties.getSecretId();
        String secretKey = tencentProperties.getSecretKey();
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

        // ClientConfig 中包含了后续请求 COS 的客户端设置:
        ClientConfig clientConfig = new ClientConfig();

        // 设置 bucket 的地域
        // COS_REGION 请参照 https://cloud.tencent.com/document/product/436/6224
        clientConfig.setRegion(new Region(tencentProperties.getRegion()));

        // 设置请求协议, http 或者 https
        // 5.6.53 及更低的版本,建议设置使用 https 协议
        // 5.6.54 及更高版本,默认使用了 https
        clientConfig.setHttpProtocol(HttpProtocol.https);

        // 以下的设置,是可选的:

        // 设置 socket 读取超时,默认 30s
        clientConfig.setSocketTimeout(30*1000);
        // 设置建立连接超时,默认 30s
        clientConfig.setConnectionTimeout(30*1000);

        // 如果需要的话,设置 http 代理,ip 以及 port
//        clientConfig.setHttpProxyIp("httpProxyIp");
//        clientConfig.setHttpProxyPort(80);

        // 生成 cos 客户端。
        return new COSClient(cred, clientConfig);
    }

    // 创建 TransferManager 实例,这个实例用来后续调用高级接口
    TransferManager createTransferManager() {
        // 创建一个 COSClient 实例,这是访问 COS 服务的基础实例。
        // 详细代码参见本页: 简单操作 -> 创建 COSClient
        COSClient cosClient = createCOSClient();

        // 自定义线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源
        // 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。
        ExecutorService threadPool = Executors.newFixedThreadPool(32);

        // 传入一个 threadpool, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。
        TransferManager transferManager = new TransferManager(cosClient, threadPool);

        // 设置高级接口的配置项
        // 分块上传阈值和分块大小分别为 5MB 和 1MB
        TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();
        transferManagerConfiguration.setMultipartUploadThreshold(5*1024*1024);
        transferManagerConfiguration.setMinimumUploadPartSize(1*1024*1024);
        transferManager.setConfiguration(transferManagerConfiguration);

        return transferManager;
    }

    void shutdownTransferManager(TransferManager transferManager) {
        // 指定参数为 true, 则同时会关闭 transferManager 内部的 COSClient 实例。
        // 指定参数为 false, 则不会关闭 transferManager 内部的 COSClient 实例。
        transferManager.shutdownNow(true);
    }

    @Override
    public UploadDto upload(MultipartFile file) throws Exception {
        return upload(file, null);
    }

    @Override
    public UploadDto upload(MultipartFile file, String filePath) throws Exception {
        //文件名
        String fileFullName = FileUtil.getName(file.getOriginalFilename());
        InputStream inputStream = file.getInputStream();
        return upload(inputStream, fileFullName, filePath);
    }

    public UploadDto upload(InputStream inputStream, String fileFullName, String filePath) throws Exception {
        if (inputStream == null) {
            throw new Exception("上传文件不能为空");
        }
        TransferManager transferManager = createTransferManager();
        String bucketName = tencentProperties.getBucketName();

        //int inputStreamLength = 1024 * 1024;
//        byte data[] = new byte[inputStreamLength];
//        InputStream inputStream = new ByteArrayInputStream(data);

        ObjectMetadata objectMetadata = new ObjectMetadata();
        // 上传的流如果能够获取准确的流长度,则推荐一定填写 content-length
        // 如果确实没办法获取到,则下面这行可以省略,但同时高级接口也没办法使用分块上传了
        //objectMetadata.setContentLength(inputStreamLength);
        try {
            //时间戳
            String timestamp = String.valueOf(System.currentTimeMillis());
            //文件扩展名
             String extension = FileUtil.getSuffix(fileFullName);
            String fileName = FileUtil.getPrefix(fileFullName);
            List<String> fileTypes = tencentProperties.getFileTypes();
            if(fileTypes != null) {
                boolean flag= fileTypes.contains(extension);
                Assert.isTrue(flag, "不支持上传的文件类型:" + extension);
            }
            String upFilePath = StringUtils.join(fileName, "_", timestamp, ".", extension);
            if(filePath != null) {
                upFilePath = StringUtils.join(filePath, "/", upFilePath);
            }
            String key = upFilePath;
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, objectMetadata);
            // 高级接口会返回一个异步结果Upload
            // 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回UploadResult, 失败抛出异常
            Upload upload = transferManager.upload(putObjectRequest);
            UploadResult uploadResult = upload.waitForUploadResult();
            if (uploadResult == null) {
                log.error("上传附件到腾讯云失败 fileName={}", upFilePath);
                throw new Exception("上传附件 " + upFilePath + " 到腾讯云失败 ");
            }

            log.info("cos fileName:" + upFilePath);
            //返回上传结果
            UploadDto uploadDto = new UploadDto();
            uploadDto.setName(upFilePath);
//            uploadDto.setKey(upFilePath);
            uploadDto.setCreateTime(DateUtil.date());
            return uploadDto;
        } catch (Exception e) {
            log.error("cos 上传失败", e);
            throw new RuntimeException("文件="+fileFullName + " 上传失败");
        } finally {
            shutdownTransferManager(transferManager);
        }
    }

    @Override
    public byte[] download(String key) throws Exception {
        return null;
    }


    @Override
    public void delete(String key) {

    }

}
import java.io.Serializable;
import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;

import lombok.Data;


@Data
public class UploadDto implements Serializable {
	
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**图片名*/
    private String name;
    /**图片路径*/
    private String imgUrl;

    /**上传日期*/
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createTime;
}

3、maven需要引入的腾讯云OSS依赖

		<!--cos -->
		<dependency>
			<groupId>com.qcloud</groupId>
			<artifactId>cos_api</artifactId>
			<version>5.6.89</version>
		</dependency>

-------------------

腾讯云OSS(Object Storage Service)是一种基于对象的存储服务,提供高可用、高可靠、低成本、可扩展的存储资源。以下是腾讯云OSS的原理与使用:

一、腾讯云OSS原理

  1. 分布式存储架构

腾讯云OSS采用分布式存储架构,将数据分散存储在多个节点上,以提高数据的可靠性和可用性。每个节点都采用副本冗余的方式进行数据备份,确保数据不会因为某个节点故障而丢失。同时,通过分布式负载均衡技术,将数据均匀分布在各个节点上,提高数据访问的效率和稳定性。

  1. 数据冗余与容错

腾讯云OSS采用数据冗余和容错技术,确保数据的可靠性和可用性。在分布式存储架构中,每个数据块都会备份多个副本,分布在不同的节点上,确保即使某个节点发生故障,其他节点上的副本仍然可用。此外,腾讯云OSS还采用数据校验技术,对数据进行冗余校验,检测数据是否损坏或丢失。

  1. 数据加密与安全保护

腾讯云OSS采用数据加密和安全保护技术,确保数据的安全性。在数据传输过程中,腾讯云OSS采用SSL/TLS加密技术,对数据进行加密传输,防止数据被窃取或篡改。在数据存储时,腾讯云OSS采用加密技术对数据进行加密存储,确保数据在存储时不会被窃取或篡改。

二、腾讯云OSS使用

  1. 注册与登录腾讯云OSS

首先需要注册腾讯云账号并登录到腾讯云控制台,然后在服务列表中找到并选择“对象存储服务(OSS)”。

  1. 创建存储空间

在腾讯云OSS控制台中,可以选择创建新的存储空间。填写存储空间的名称、选择地域和存储类型等信息,并设置访问权限和安全策略等。

  1. 上传文件

在腾讯云OSS控制台中,可以上传文件到创建的存储空间中。可以选择上传本地文件或直接上传文件流。在上传文件时,可以选择文件的名称、存储类型和访问权限等信息。

  1. 下载文件

在腾讯云OSS控制台中,可以下载存储空间中的文件。可以选择下载文件的名称、下载路径和下载方式等信息。同时,也可以设置下载文件的访问权限和有效期等。

  1. 删除文件

在腾讯云OSS控制台中,可以删除存储空间中的文件。选择要删除的文件名称,点击删除即可。需要注意的是,删除的文件将无法恢复,请谨慎操作。

  1. 配置CDN加速

为了提高文件的访问速度,可以在腾讯云OSS控制台中配置CDN加速服务。配置完成后,将通过CDN节点加速访问存储空间中的文件。可以提高文件的响应速度和可扩展性。

以上是腾讯云OSS的原理与使用简介,供您参考。如需获取更多详细信息,建议访问腾讯云官网或咨询其官方客服人员。文章来源地址https://www.toymoban.com/news/detail-510034.html

到了这里,关于JAVA开发(腾讯云OSS图片上传)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot项目上传图片(本地/OSS)

    可参考视频: 【springboot上传图片的两种方式详解(本地/OSS对象存储)】 https://www.bilibili.com/video/BV1TK411Z7ad/?share_source=copy_webvd_source=7f0416c71bcbaf44e08ad58367e3f198 视频前十分钟是从0开始编写图片保存到本地,可以照着视频敲出来,不想看也可以直接复制我下面的代码 在 Resources 目

    2023年04月14日
    浏览(44)
  • 【flutter直接上传图片到阿里云OSS】

    flutter直接上传文件到阿里云需要获取凭证,通过调用阿里云获取凭证的接口能拿到下面这些参数 获取凭证的接口一般是后台去对接阿里云,前端调后台接口即可。(STS.的这种AccessKeyId安全性高一些) 1.获取OSSToken信息 token信息实体类 上传方法 调用方式 以上直接是上传图片到

    2024年02月11日
    浏览(40)
  • 使用SpringBoot将图片上传至阿里云OSS

    1. 什么是OSS? 官方的解释是这样的:阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。 官网:对象存储OSS 2. 为什么要使用OSS? 作者认为主要是方便项目上线后的文件业务的处

    2024年02月06日
    浏览(46)
  • SpringBoot整合阿里云Oss实现文件图片上传

    目录 1. 阿里云Oss注册使用 2. 项目中使用 2.1 引入依赖以及插件 2.2 编写配置文件application.properties 2.3 创建常量类,获取配置信息  2.4 serviceImpl中实现逻辑            

    2024年02月08日
    浏览(68)
  • Vue中实现图片上传,上传后的图片回显,存储图片到服务器 【使用对象存储OSS】

    前言 以下只提供一种思路,对新手可能不太友好。 这里将前端Vue上传的图片直接存储到服务器上, Alibaba Cloud OSS : 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储

    2024年02月06日
    浏览(74)
  • PHP之 使用阿里云对象存储OSS上传图片

    参考地址 https://blog.csdn.net/weixin_42672802/article/details/129136850 https://blog.csdn.net/HZX19941018/article/details/86066529

    2024年02月16日
    浏览(47)
  • 阿里云OSS存储图片在上传的时候设置过期时间

    第一种方法:在上传文件时设置过期时间 在使用 putObject 方法上传文件时,可以通过设置 x-oss-expires 和 x-oss-delete-after 头部来设定文件的过期时间。 以下是示例代码: 上述代码中,我们在 headers 中添加了 x-oss-expires 和 x-oss-delete-after 头部来设定文件的过期时间,其中 x-oss-ex

    2024年02月07日
    浏览(55)
  • upload上传图片到腾讯云,如何上传图片

    讲解一下如何上传图片到腾讯云,上传到其他第三方云盘操作也是大致一样的; 1.创建一个腾讯云账号,跟着提示操作即可(必须实名-为了安全),中间选择 对象存储cos,这里就创建好了; 2.接下来需要创建存储桶,里面的权限为:公有读,私有写; 3.设置cors规则,AllowHeade

    2023年04月17日
    浏览(40)
  • 【业务功能篇77】微服务-OSS对象存储-上传下载图片

    3. 图片管理 文件存储的几种方式 单体架构可以直接把图片存储在服务器中 但是在分布式环境下面直接存储在WEB服务器中的方式就不可取了,这时我们需要搭建独立的文件存储服务器。 3.1 开通阿里云服务 针对本系统中的相关的文件,图片,文本等统一的交给云服务器管理。

    2024年02月11日
    浏览(52)
  • 图片上传怎么搞?!阿里云OSS对象存储教你快速实现!

    一. 需求 背景 小白:  辉哥,我想在项目中实现图片上传,不知道有没有好用的第三方文件上传技术呢? 辉哥: 那多了去了,阿里、腾讯、百度、七牛云等都有文件上传技术,你从中随便挑一个,辉哥这就给你安排。 小白: 阿里也有文件上传?!!!要不辉哥就给我安排

    2024年01月19日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包