导入依赖
<!-- 七牛云 --> <dependency> <groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>[7.5.0, 7.5.99]</version> </dependency> <!--Gosn依赖--> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.6</version> </dependency>
application.yml 配置
# 七牛云 oss: qiniu: domain: 填入你的访问域名 # 访问域名(默认使用七牛云测试域名) accessKey: 填入你的公钥 # 公钥 secretKey: 填入你的私钥 # 私钥 bucketName: 填入你的存储空间名 #存储空间名称
QiNiuYunConfig.java
@Configuration public class QiNiuYunConfig { /** * 七牛域名domain */ @Value("${oss.qiniu.domain}") private String qiniuDomain; /** * 七牛ACCESS_KEY */ @Value("${oss.qiniu.accessKey}") private String qiniuAccessKey; /** * 七牛SECRET_KEY */ @Value("${oss.qiniu.secretKey}") private String qiniuSecretKey; /** * 七牛空间名 */ @Value("${oss.qiniu.bucketName}") private String qiniuBucketName; protected static Logger logger = LoggerFactory.getLogger(QiNiuYunConfig.class); public String uploadPhoto(String filename, FileInputStream file) { // 构造一个带指定Region对象的配置类,注意后面的Region个地区不一样的 Configuration cfg = new Configuration(Region.region2()); cfg.useHttpsDomains = false; UploadManager uploadManager = new UploadManager(cfg); // 生成上传凭证,然后准备上传 Auth auth = Auth.create(qiniuAccessKey, qiniuSecretKey); String upToken = auth.uploadToken(qiniuBucketName); try { Response response = uploadManager.put(file, filename, upToken, null, null); // 解析上传成功的结果 DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); // 这个returnPath是获得到的外链地址,通过这个地址可以直接打开图片 return "http://"+qiniuDomain+"/"+putRet.key; } catch (QiniuException ex) { Response r = ex.response; logger.error(r.toString()); System.err.println(); try { logger.error(r.bodyString()); } catch (QiniuException ex2) { r = ex2.response; logger.error(r.toString()); } } return ""; } public boolean deletePhoto(String fileName) { Configuration configuration = new Configuration(Region.region2()); Auth auth = Auth.create(qiniuAccessKey, qiniuSecretKey); BucketManager bucketManager = new BucketManager(auth, configuration); try { if (fileName != null) { bucketManager.delete(qiniuBucketName, fileName); return true; } } catch (QiniuException ex) { //如果遇到异常,说明删除失败 logger.error(String.valueOf(ex.code())); logger.error(ex.response.toString()); } return false; } }
使用案例:
七牛云返回的路径格式:
http:// 访问域名 / 图片名称
注:
这里的RespBean是自定义的响应类
@Autowired protected static final Logger logger = LoggerFactory.getLogger(QrCodeController.class); private QiNiuYunConfig qiNiuYunConfig; @Autowired private IQrCodeService iQrCodeService; @PostMapping("qrCode/insert") @ApiOperation("上传二维码图片") @ApiImplicitParams({ @ApiImplicitParam(name = "photoName", value = "图片名称", dataTypeClass = String.class) }) public RespBean insert(@RequestParam String photoName, @RequestPart("file") MultipartFile file) { QrCode qrCode = new QrCode(); qrCode.setPhotoName(photoName); // 获取文件名 //String fileName = file.getOriginalFilename(); // 生成随机的图片名 (这个案例中没使用) //String photoName = UUID.randomUUID() + "-" +fileName; if (!file.isEmpty()) { try { FileInputStream inputStream = (FileInputStream) file.getInputStream(); // 这里接收 七牛云返回的 图片地址 String path = iQiNiuYunService.uploadPhoto(photoName, inputStream); qrCode.setPhotoAddress(path); // 将二维码实体qrcode 插入到mysql数据库中 if (iQrCodeService.insert(qrCode)) { logger.info("上传成功!"); return RespBean.ok("上传成功!"); } } catch (IOException e) { e.printStackTrace(); } } return RespBean.error("上传失败!"); } @DeleteMapping("qrCode/delete") @ApiOperation("根据照片名删除图片") @ApiImplicitParam(name = "photoName", value = "图片名称",dataTypeClass = String.class) public RespBean delete(@RequestParam String photoName){ if (iQiNiuYunService.deletePhoto(photoName)&&iQrCodeService.delete(photoName)){ return RespBean.ok("删除成功"); } return RespBean.ok("删除失败,未找到该图片!"); }
相关说明:
关于 Region 对象和机房的关系如下:
机房 Region
华东 Region.region0() , Region.huadong()
华北 Region.region1() , Region.huabei()
华南 Region.region2() , Region.huanan()
北美 Region.regionNa0() , Region.beimei()