使用SpringBoot上传文件到腾讯云

最近在做一个项目,涉及到腾讯上传文件/图片服务器,为了图方便并且提升访问速度,想着上传到腾讯云存储桶是一个不错的选择。腾讯云存储桶的创建可见我之前的文章

使用腾讯云存储桶存储博客图片

当然存储桶里面不仅可以存图片,也可以存储其它文件、视频,甚至整个博客静态文件都可以存储进行访问。

添加依赖

首先我们在 SpringBoot 的依赖中添加:

<!-- 腾讯云 -->
<dependency>
    <groupId>com.qcloud</groupId>
    <artifactId>cos_api</artifactId>
    <version>5.4.10</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>

然后我们在 SpringBoot 的配置文件 application.yml 中添加配置信息:

# 腾讯云地址
tencent:
  path: https://forum-xxxxxxxx.cos.ap-guangzhou.myqcloud.com/

上面的路径就是你访问的存储桶域名

编写文件上传控制器工具类

一般项目中是存在一个 utils 工具类包的,我们在其中新建一个文件上传的工具类,代码如下。其中需要我们填写 bucketName、secretId 和 secretkey 三个字段,

这三个字段来源均参考上述使用「 腾讯云存储博客图片」 一文中详解。

这三个字段也可以写在配置文件中,然后使用 SpringBoot 的 @Value
属性注入字段。不过为了方便我就直接写在后端代码中啦。

package cn.bestzuo.zuoforum.util;

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.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.model.*;
import com.qcloud.cos.region.Region;

import java.io.File;
import java.util.Random;

/**
 * 腾讯云对象存储
 */
public class TencentCOS {

    // 此处填写的存储桶名称
    private static final String bucketName = "forum-12xxxx558";
    // secretId
    private static final String secretId = "xxxx";
    // secretKey
    private static final String secretKey = "xxxx";

    // 1 初始化用户身份信息(secretId, secretKey,可在腾讯云后台中的API密钥管理中查看!
    private static COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

    // 2 设置bucket的区域, COS地域的简称请参照
    // https://cloud.tencent.com/document/product/436/6224,根据自己创建的存储桶选择地区
    private static ClientConfig clientConfig = new ClientConfig(new Region("ap-guangzhou"));


    /**
     * 简单文件上传, 最大支持 5 GB, 适用于小文件上传, 建议 20 M 以下的文件使用该接口 大文件上传请参照 API 文档高级 API 上传
     *
     * @param localFile 要上传的文件
     */
    public static String uploadfile(File localFile,String pathPrefix) throws CosClientException, CosServiceException {

        // 生成cos客户端
        COSClient cosclient = new COSClient(cred, clientConfig);
        String fileName = "";
        try {
            fileName = localFile.getName();
            String substring = fileName.substring(fileName.lastIndexOf("."));
            Random random = new Random();
            // 指定要上传到 COS 上的路径
            fileName = pathPrefix + "/" + random.nextInt(10000) + System.currentTimeMillis() + substring;
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, localFile);
            PutObjectResult putObjectResult = cosclient.putObject(putObjectRequest);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭客户端(关闭后台线程)
            cosclient.shutdown();
        }
        return fileName;
    }



    /**
     * 下载文件
     */
    public static void downFile() {
        // 生成cos客户端
        COSClient cosclient = new COSClient(cred, clientConfig);
        //要下载的文件路径和名称
        String key = "down/demo1.jpg";
        // 指定文件的存储路径
        File downFile = new File("src/test/resources/mydown.txt");
        // 指定要下载的文件所在的 bucket 和对象键
        GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
        ObjectMetadata downObjectMeta = cosclient.getObject(getObjectRequest, downFile);
    }


    /**
     * 删除文件
     */
    public static void deletefile(String key) throws CosClientException, CosServiceException {
        // 生成cos客户端
        COSClient cosclient = new COSClient(cred, clientConfig);
        // 指定要删除的 bucket 和路径
        cosclient.deleteObject(bucketName, key);
        // 关闭客户端(关闭后台线程)
        cosclient.shutdown();
    }
}

添加 Controller 类

然后我们就可以创建一个 Controller 类进行调用了,以下是一个上传图片控制器类,也可以根据自己需求进行修改,注释都写在代码中了。

package cn.bestzuo.zuoforum.controller;

import cn.bestzuo.zuoforum.common.ForumResult;
import cn.bestzuo.zuoforum.common.LayEditUploadImageResult;
import cn.bestzuo.zuoforum.common.WangEditorResult;
import cn.bestzuo.zuoforum.pojo.UploadImage;
import cn.bestzuo.zuoforum.service.UserInfoService;
import cn.bestzuo.zuoforum.util.TencentCOS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 图片上传Controller
 */
@Controller
public class ImageUploadController {

    @Value("${tencent.path}")
    private String IMAGE_PATH;

    @Autowired
    private UserInfoService userInfoService;

    /**
     * 上传头像
     */
    @RequestMapping("/upload")
    @ResponseBody
    public ForumResult upload(@RequestParam("file") MultipartFile multipartFile, @RequestParam("username") String username, Model model) throws Exception {
        //获取文件的名称
        String fileName = multipartFile.getOriginalFilename();

        //判断有无后缀
        if (fileName.lastIndexOf(".") < 0)
            return new ForumResult(500, "上传图片格式不正确", null);

        //获取文件后缀
        String prefix = fileName.substring(fileName.lastIndexOf("."));

        //如果不是图片
        if (!prefix.equalsIgnoreCase(".jpg") && !prefix.equalsIgnoreCase(".jpeg") && !prefix.equalsIgnoreCase(".svg") && !prefix.equalsIgnoreCase(".gif") && !prefix.equalsIgnoreCase(".png")) {
            return new ForumResult(500, "上传图片格式不正确", null);
        }

        //使用uuid作为文件名,防止生成的临时文件重复
        final File excelFile = File.createTempFile("imagesFile-" + System.currentTimeMillis(), prefix);
        //将Multifile转换成File
        multipartFile.transferTo(excelFile);

        //调用腾讯云工具上传文件
        String imageName = TencentCOS.uploadfile(excelFile, "avatar");

        //程序结束时,删除临时文件
        deleteFile(excelFile);

        //存入图片名称,用于网页显示
        model.addAttribute("imageName", imageName);

        //更新数据库
        userInfoService.updateUserAvatar(imageName, username);

        //返回成功信息
        return new ForumResult(200, "头像更换成功", imageName);
    }

    /**
     * 删除临时文件
     *
     * @param files 临时文件,可变参数
     */
    private void deleteFile(File... files) {
        for (File file : files) {
            if (file.exists()) {
                file.delete();
            }
        }
    }
    
}

原文 

https://bestzuo.cn/posts/2962765553.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 使用SpringBoot上传文件到腾讯云

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址