下面是图片上传的逻辑:
import java.io.UnsupportedEncodingException;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Base64Utils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.platform.app.document.service.impl.ElectronicPolicyServiceImpl;
import com.platform.tools.utils.COSClientUtil;
@RestController
public class UploadController {
private Logger logger = LoggerFactory.getLogger(ElectronicPolicyServiceImpl.class);
/**
* 上传图片至腾讯云cos
* @param base64Img base64加密图片数据
* @param strName 上传图片的后缀类型,例如:.jpg
* @return url 图片在cos上的url
*/
@RequestMapping(value = "/admin/upload", method = RequestMethod.POST)
public String upload(@RequestParam("base64Img") String base64Img, @RequestParam("strName") String strName) {
logger.info("base64加密图片数据:"+base64Img.toString());
logger.info("上传图片的后缀类型:"+strName.toString());
// 获取base64加密内容
String fileImg = base64Img.split(",")[1];
byte[] bytes = null;
try {
// 解密base64,转换成数组
bytes = Base64Utils.decode(fileImg.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 图片的名称用uuid生成
strName = UUID.randomUUID().toString()+"."+strName;
// 调用工具类上传图片
COSClientUtil cosClientUtil = new COSClientUtil();
// 返回图片在cos服务器上的url
String url = cosClientUtil.uploadFile(bytes, strName);
logger.info("图片在cos服务器上的url:"+url.toString());
return url;
}
}
下面是工具类:
public static String uploadFile(byte[] bytes, String fileName) {
String backUrl = "";
// String bucket = BUCKETNAME + "-" + APPID;
// String bucket="claim-1252337168";
System.out.println(BUCKETNAME);
String key = KEY + fileName;
ObjectMetadata metadata = new ObjectMetadata();
// metadata.setContentType("image/jpeg");
metadata.setContentLength(bytes.length);
PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKETNAME, key, new ByteArrayInputStream(bytes),
metadata);
// 设置存储类型, 默认是标准(Standard), 低频(standard_ia)
putObjectRequest.setStorageClass(StorageClass.Standard_IA);
COSClient cc = getCosClient();
try {
PutObjectResult putObjectResult = cc.putObject(putObjectRequest);
// putobjectResult会返回文件的etag
backUrl = host + "/" + key;
System.out.println(backUrl);
return backUrl;
} catch (CosServiceException e) {
e.printStackTrace();
} catch (CosClientException e) {
e.printStackTrace();
}
// 关闭客户端
cc.shutdown();
return backUrl;
}
其中有个坑困扰了我一下午;
上传图片方法的参数有2个:
base64Img:base64加密图片数据
strName:上传图片的后缀类型,例如:.jpg
而图片经过base64加密之后会生成一串字符串,大致是下面的数据格式:
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAkGBggGBQkIBwgKCQkKDRYODQwMDRoTFBAWHxwhIB8cHh4jJzIqIyUvJR4eKzssLzM1ODg4ISo9QTw2QTI3ODX/2wBDAQkKCg0LDRkODhk1JB4kNTU1NTU1NTU
不经过处理将上图的数据当成参数base64Img传入,会一直报错:Illegal base64 character a ;百度给的建议是换个base64解密的方法;在经过N多次尝试后,依然报错;
后来请教大神发现是传入的base64参数有问题,但是不会直接报参数问题;
base64加密后会生成一个头信息“data:image/jpeg;base64,” 需要将此信息去掉才是真正的base64数据信息;
上面是完整的上传图片至腾讯云cos服务器的代码,希望有用~