Skip to content

Jfinal上传文件到腾讯云cos 迁移

前言

最近由于阿里云服务器快到期,所以看了一下腾讯云,在老哥的推荐下买了个一个腾讯轻量服务器,用起来还不错(很nice),然后就逛了逛了腾讯云,看到了cos,点了下免费试用,送了50g半年的使用,爱了爱了

之前上传一直是上传到服务器,现在上传到cos,看了一下文档,炒鸡简单,搞起

申请API秘钥

API秘钥地址

自个申请哈 我们需要用到 secretId secretKey

创建储存桶

进入详情页 然后复制对象地址 到浏览器直接访问即可 有可能需要等几分钟生效 稍等一下即可

当然上传文件肯定得在代码中运行 下面开始撸码

maven依赖

xml
<dependency>
    <groupId>com.qcloud</groupId>
    <artifactId>cos_api</artifactId>
    <version>5.6.45</version>
</dependency>
  • 客户端配置相关类在 com.qcloud.cos.* 包下。
  • 权限相关类在 com.qcloud.cos.auth.* 子包下。
  • 异常相关类在 com.qcloud.cos.exception.* 子包下。
  • 请求相关类在 com.qcloud.cos.model.* 子包下。
  • 地域相关类在 com.qcloud.cos.region.* 子包下。
  • 高级 API 接口在 com.qcloud.cos.transfer.* 子包下

定义cos地区字典

这一个需要吐槽 他没有定义自定文件 只提供了一个文档 COS 地域的简称

java
/**
 * 腾讯云地域名称key
 */
public class CosRegionName {
    /**公有云 广州*/
    public static final String GUANG_ZHOU="ap-guangzhou";
    /**公有云 广州*/
    public static final String BEI_JING="ap-beijing";
    /**公有云 广州*/
    public static final String NAN_JING="ap-nanjing";
    /**公有云 广州*/
    public static final String SHANG_HAI="ap-shanghai";
    /**公有云 广州*/
    public static final String CHENG_DU="ap-chengdu";
    /**公有云 广州*/
    public static final String CHONG_QING="ap-chongqing";
}

腾讯上传示例

java
// 指定要上传的文件
File localFile = new File(localFilePath);
// 指定文件将要存放的存储桶
String bucketName = "examplebucket-1250000000";
// 指定文件上传到 COS 上的路径,即对象键。例如对象键为folder/picture.jpg,则表示将文件 picture.jpg 上传到 folder 路径下
String key = "exampleobject";
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);

看到上面得上传很简单 只需要要有文件和存储桶名称 cosClient就可以了,那么我们来改造一下

创建上传实体CosUploadFile

java
public class CosUploadFile {
    /**
     * 地区名称
     *
     * @see CosRegionName
     */
    private String regionName;
    /**
     * 储存桶名
     */
    private String bucketName;
    /**
     * 储存url 全路径
     */
    private String url;
    /**
     * 文件对象
     */
    private File file;

    public CosUploadFile(String regionName, String bucketName, String url, File file) {
        this.regionName = regionName;
        this.bucketName = bucketName;
        this.url = url;
        this.file = file;
    }
    ......getter ......setter
}

定义支持CosSupport

java
/**
 * @author light_dust
 * @since 2021/7/31 11:53
 */
public class CosSupport {
    private static final CosSupport me = new CosSupport();

    public static CosSupport me() {
        return me;
    }

    /**
     * 获取地区储cos
     *
     * @param regionName 地域名称
     */
    public COSClient getCosClientByRegionName(String regionName) {
        // 1 初始化用户身份信息(secretId, secretKey)。
        // SECRETID和SECRETKEY请登录访问管理控制台进行查看和管理
        String secretId = PropKit.get("tencent.cloud.secretId");
        String secretKey = PropKit.get("tencent.cloud.secretKey");
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
        // 2 设置 bucket 的地域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
        // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
        Region region = new Region(regionName);
        ClientConfig clientConfig = new ClientConfig(region);
        // 这里建议设置使用 https 协议
        clientConfig.setHttpProtocol(HttpProtocol.https);
        // 3 生成 cos 客户端。
        return new COSClient(cred, clientConfig);
    }
    
    /**
     * 上传文件到腾讯云cos
     */
    public void UploadFileToBucket(CosUploadFile cosUploadFile){
        PutObjectRequest putObjectRequest = new PutObjectRequest(cosUploadFile.getBucketName(), cosUploadFile.getUrl(), cosUploadFile.getFile());
        getCosClientByRegionName(cosUploadFile.getRegionName()).putObject(putObjectRequest);
    }
}

定义上传接口类

java
/**
 * 上传接口
 *
 * @author light_dust
 * @since 2021/8/10 11:36
 */
public interface IWishUpload {
    /**
     * 上传文件 返回 文件上传路径
     * @param uploadFile 上传文件对象
     */
    String upload(UploadFile uploadFile);
}

创建实现类

java
/**
 * @author light_dust
 * @since 2021/8/10 11:39
 */
public class CosUpload implements IWishUpload {

    /**
     * 地区名称
     */
    private final String regionName;
    /**
     * 储存桶名称
     */
    private final String bucketName;
    /**
     * 储存文件夹根地址
     */
    private final String folderBasePath;

    public CosUpload(String regionName, String bucketName, String folderBasePath) {
        this.regionName = regionName;
        this.bucketName = bucketName;
        this.folderBasePath = folderBasePath;
    }

    @Override
    public String upload(UploadFile uploadFile) {
        String foldUrl = createFolderPath();
        String newFileName = rename(uploadFile);
        String uploadFileUrl = foldUrl + newFileName;
        //创建cosUploadFile对象
        CosUploadFile cosUploadFile = new CosUploadFile(this.regionName, this.bucketName, uploadFileUrl, uploadFile.getFile());
        //上传到储存桶
        CosSupport.me().UploadFileToBucket(cosUploadFile);
        //清理上传文件
        uploadFile.getFile().deleteOnExit();
        return uploadFileUrl;
    }

    /**
     * 创建文件上传的文件夹路径 不同的上传可以使用不同的传输
     */
    public String createFolderPath() {
        return folderBasePath + DateUtil.format(new Date(), "yyyy-MM-dd") + "/";
    }

    /**
     * 文件重命名 按照一定的规则
     *
     * @param uploadFile 上传文件对象
     */
    public String rename(UploadFile uploadFile) {
        String fileName = uploadFile.getFileName();
        return DateUtil.format(new Date(), "yyyyMMddHHmmss") + fileName.substring(fileName.lastIndexOf("."));
    }
}

上传示例

java
/**
* 上传用户头像
* @param uploadFile 上传文件
* @param userId 用户id
*/
public void uploadAvatar(UploadFile uploadFile, String userId) throws WishException{
    User user=User.dao.findById(userId);
    if(user==null) throw new WishException(WishExceptionKey.MODEL_ID_QUERY_FAIL_CAUSE_NULL,userId);
    CosUpload cosUpload = new CosUpload(CosRegionName.GUANG_ZHOU, PropKit.get("tencent.cloud.cos.bucketName"), //这个是储存桶名称
    PropKit.get("wish.upload.user.avatar.path"));//这个是上传头像路径
    String avatarUrl = cosUpload.upload(uploadFile);
    user.setUserAvatar(avatarUrl);
    user.update();
}

代码地址