腾讯对象存储与⼩程序之坑[Java]
腾讯对象存储与⼩程序之坑[Java]
最近写⼀个⼩程序,涉及到了⽂件上传,主要是上传图⽚。后台是Java+SSM框架,⽤到了腾讯云COS对象存储,下⾯详细介绍⼀下我遇到的各种坑。如有错误,请多指教。
腾讯对象存储
⾸先Maven⼯程要导⼊下⾯⼏个包,其中⼀个是腾讯云存储的官⽅⽂档中说明的必须要的包。commons-codec包腾讯的⽂档中并没有说要导⼊,但没有的话会报不到类dec.digest…pom⽂件如下
<!-- 腾讯云 -->
<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>
<!-- mvnrepository/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- mvnrepository/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
导⼊这些包之后,要写⼀个Util⼯具
package com.queue.util;
import java.io.InputStream;
import java.util.Random;
import org.springframework.web.multipart.MultipartFile;
import s.COSClient;
import s.ClientConfig;
import s.auth.BasicCOSCredentials;
import s.auth.COSCredentials;
import s.model.ObjectMetadata;
import s.model.PutObjectRequest;
import s.model.PutObjectResult;
import s.region.Region;
public class TencentCOS {
// 存储桶名称
private static final String bucketName = "queue-1********610";
// secretId
private static final String secretId = "AKIDxwnBRi9***************************so9PdQCt";
//secretKey
private static final String secretKey = "jspvsjS0SnyW0*************************tq65lK";
// 初始化⽤户⾝份
private static COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
// 设置bucket的区域
private static ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing"));
public static String uploadfile(MultipartFile file) throws Exception {
if (Size() > 1024 * 1024) {
throw new Exception("上传图⽚⼤⼩不能超过1M!");
}
// ⽣成cos客户端
COSClient cosclient = new COSClient(cred, clientConfig);
String fileName = null;
// fileName = Name();
// String substring = fileName.substring(fileName.lastIndexOf("."));
String originalFilename = OriginalFilename();
String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
Random random = new Random();
try {
InputStream inputStream = InputStream();
// 指定要上传到 COS 上的路径
fileName = "images/"+Int(10000) + System.currentTimeMillis() + substring;
// PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, localFile);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(inputStream.available());
metadata.setCacheControl("no-cache");
metadata.setHeader("Pragma", "no-cache");
metadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
metadata.setContentDisposition("inline;filename=" + fileName);
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, inputStream, metadata); cosclient.putObject(putObjectRequest);
}catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭客户端(后台线程)
cosclient.shutdown();
}
return fileName;
}
/**
* Description: 判断OSS服务⽂件上传时⽂件的contentType
*
* @param FilenameExtension ⽂件后缀
* @return String
*/
public static String getcontentType(String FilenameExtension) {
if (FilenameExtension.equalsIgnoreCase(".bmp")) {
return "image/bmp";
}
if (FilenameExtension.equalsIgnoreCase(".gif")) {
return "image/gif";
}
if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
FilenameExtension.equalsIgnoreCase(".jpg") ||
FilenameExtension.equalsIgnoreCase(".jpg") ||
FilenameExtension.equalsIgnoreCase(".png")) {
return "image/jpeg";
}
if (FilenameExtension.equalsIgnoreCase(".html")) {
return "text/html";
}
if (FilenameExtension.equalsIgnoreCase(".txt")) {
return "text/plain";
}
if (FilenameExtension.equalsIgnoreCase(".vsd")) {
return "application/vnd.visio";
}
if (FilenameExtension.equalsIgnoreCase(".pptx") ||
FilenameExtension.equalsIgnoreCase(".ppt")) {
return "application/vnd.ms-powerpoint";
}
if (FilenameExtension.equalsIgnoreCase(".docx") ||
FilenameExtension.equalsIgnoreCase(".doc")) {
return "application/msword";
}
if (FilenameExtension.equalsIgnoreCase(".xml")) {
return "text/xml";
}
return "image/jpeg";
}
}
有这个⼯具类之后上传⽂件就很⽅便了,⼯具类中⽣成cos客户端在⽂件上传失败时⾃动重复上传5次,如果5次都失败了就会报错。
由于我的项⽬前端是⼩程序,⼩程序传给后台的⽂件类型是MultipartFile,为了使⽤⽅便在⼯具类中对MultipartFile做了⼀些操作。主要思路是:
1. 提取⽂件名字+随机数(防重)
2. getInputStream() 获取⽂件输⼊流
3. 获取⽂件其他信息,metadata
如果您上传的⽂件是File类型⽽不是MultipartFile,您可以⾃⼰对上边⼯具类进⾏⼀些修改,或去看看其他帖⼦。
有了以上⼯具类,在上传⽂件时就可以这样做:
String suburl = TencentCOS.uploadfile(multfile);
具体后台代码如下:
Controller层
@Controller
@RequestMapping("/img")
public class ImgController {
@Autowired
private IImgService imgService;
/**
* 创建队列
* @param leaderopenid
* @param leaderwxname
* @param quename
* @param state
* @param introduce
* @param file
* @return
* @throws Exception
*/
@RequestMapping("/upload")
有趣的java小程序public @ResponseBody int doUpload(String leaderopenid, String leaderwxname, String quename, String state,String introduce, String location, @Request Param(value = "file", required = false) MultipartFile file)
throws Exception {
atQue(leaderopenid, leaderwxname, quename, state, introduce, location, file);
}
service层
@Override
public int creatQue(String leaderopenid, String leaderwxname, String quename, String state, String introduce, String location,
MultipartFile multfile) throws Exception {
String url = "";
if(multfile!=null) {
String suburl = TencentCOS.uploadfile(multfile);
if (suburl.isEmpty()) return 0;
url = "qcloud/" + suburl;
System.out.println(url);
}
// 这⾥是⼀些其他逻辑...
⼩程序部分
选择图⽚
/**
* 从相册选择图⽚添加
*/
ChooseImage() {
wx.chooseImage({
count: 1, //默认9
sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认⼆者都有 sourceType: ['album', 'camera'], //从相册选择
success: (res) => {
console.log(res)
if (this.data.imgList.length != 0) {
this.setData({
imgList: this.pFilePaths)
})
} else {
this.setData({
imgList: pFilePaths
})
}
var filep = pFilePaths[0]
this.setData({
filep: filep
})
}
});
},
/**
* 点击图⽚查看
*/
ViewImage(e) {
wx.previewImage({
urls: this.data.imgList,
current: e.currentTarget.dataset.url
});
},
/**
* 删除图⽚
*/
DelImg(e) {
wx.showModal({
title: '删除图⽚',
content: '确定要删除这张图⽚吗?',
cancelText: '取消',
confirmText: '删除',
success: res => {
if (firm) {
this.data.imgList.splice(e.currentTarget.dataset.index, 1);
this.setData({
imgList: this.data.imgList
})
}
}
})
},
上传图⽚
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论