【小白】Java服务端 腾讯云COS接入 文件上传功能

由于项目要求,需要使用到腾讯云的COS对象存储,其中最主要是完成文件上传的功能。

一开始找到的是4.x依赖,4.x和5.x的方法不同,没有仔细研究所以走了很多弯路,后来找到5.x的demo,终于完成这一个功能。

5.x版本GitHub传送门:https://github.com/tencentyun/cos-java-sdk-v5

腾讯云官方api传送门:https://cloud.tencent.com/document/product/436/10199

1、设置pom.xml,引入依赖

        <!--腾讯云COS-->
        <dependency>
            <groupId>com.tencentcloudapi</groupId>
            <artifactId>tencentcloud-sdk-java</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.qcloud</groupId>
            <artifactId>cos_api</artifactId>
            <version>5.4.9</version>
        </dependency>

2、appid,secretId,secretKey在腾讯云控制台可以找到。

bucketname是自定义的,5.x版本的bucketname格式为{buckname}-{appid},4.x版本为{buckname}

// 1 初始化秘钥信息
COSCredentials cred = new BasicCOSCredentials("SECRETID", "SECRETKEY");
// 2 设置bucket的区域, COS地域的简称请参照 https://www.qcloud.com/document/product/436/6224
ClientConfig clientConfig = new ClientConfig(new Region("ap-guangzhou"));
// 3 生成cos客户端
COSClient cosClient = new COSClient(cred, clientConfig);

3、按照demo的写法,按部就班就能实现文件上传。

但是比较坑的是,我使用的是MultipartFile格式接收,就是直接接收前端传给我的文件对象,然而demo里面用的是【本地路径】或者【File格式转为字节流】,度娘找了一波MultipartFile与File互转的方法,但是没有成功,所以放弃了。

但其实File与MultipartFile很类似,所以选择用字节流上传的方式上传。

// 获取文件后缀
String fileName = uploadFile.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
System.out.println(suffix);
String key = new Date().getTime() + "." + suffix;

// 判断文件大小(小文件上传建议不超过20M)
byte[] bytes = uploadFile.getBytes();
int length = bytes.length;

// 获取文件流
InputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
ObjectMetadata objectMetadata = new ObjectMetadata();
// 从输入流上传必须制定content length, 否则http客户端可能会缓存所有数据,存在内存OOM的情况
objectMetadata.setContentLength(length);
// 默认下载时根据cos路径key的后缀返回响应的contenttype, 上传时设置contenttype会覆盖默认值
// objectMetadata.setContentType("image/jpeg");

PutObjectRequest putObjectRequest = new PutObjectRequest("BUCKETNAME", key, byteArrayInputStream, objectMetadata);
// 设置 Content type, 默认是 application/octet-stream
putObjectRequest.setMetadata(objectMetadata);
// 设置存储类型, 默认是标准(Standard), 低频(standard_ia)
putObjectRequest.setStorageClass(StorageClass.Standard_IA);
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);

String eTag = putObjectResult.getETag();
System.out.println(eTag);
// 关闭客户端
cosClient.shutdown();
// http://{buckname}-{appid}.cosgz.myqcloud.com/image/1545012027692.jpg
String url = URL + key;
System.out.println(url);

【附】如果能够获取到文件的本地路径,也可以采用以下方式上传

File file = new File("uploadFileLocalPath");
/*秘钥、bucket、生成客户端步骤同上*/
PutObjectRequest putObjectRequest = new PutObjectRequest("BUCKETNAME", key, file);
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);

4、测试

如果是路径测试,可以直接通过postman输入本地文件路径进行测试,

如果是文件对象,则可以通过简单的网页进行上传测试,把以前学的前端知识都还给老师了...(感谢公司的同事小哥友情提供)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>上传图片测试</title>
</head>
<body>

    <form action="接口测试路径" enctype="multipart/form-data" method="post">
	        <!--注意!id要和自己控制层的参数名相同-->
		<input type="file" id="uploadFile" name="uploadFile">
		<input type="submit" value="提交"/>	
    </form>

</body>
</html

5、上传成功之后就可以去控制台查看自己上传的文件。

6、上传也可能遇到各种问题,比如没有找到类,被这个问题卡了很久

【Caused by: java.lang.ClassNotFoundException: org.apache.commons.codec.digest】

度娘说是没有jar包,好,去一顿找,下载引入,结果,照样翻车。

最后的解决办法,在5.x的demo里面找到了这个jar,引入,o文明k。

【最后】

小白第一次写博,如有错误请各路大神指正。谢谢。

猜你喜欢

转载自blog.csdn.net/Michelle_Zhong/article/details/85059250
今日推荐