赞
踩
官网 API 文档:https://developer.qiniu.com/kodo/1239/java
所用技术:
Gson 库的主要用途是:
- 解析 JSON 数据:它允许 Java 应用程序读取 JSON 格式的字符串,并将这些数据转换成 Java 对象,无论是简单的数据类型(如 int、String)还是复杂的对象图。
- 生成 JSON 数据:Gson 同样支持将 Java 对象(包括其属性和嵌套对象)转换成 JSON 格式的字符串。这对于需要向 Web 服务发送数据或将数据保存到 JSON 文件中非常有用。
Gson 提供了简洁的 API 来处理 JSON 数据,使得在 Java 应用程序中处理 JSON 变得简单而直观。它支持复杂的对象映射,包括自定义序列化/反序列化、泛型类型处理、多态类型处理等高级功能。
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.13.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.1</version>
</dependency>
在 Spring 的配置文件中配置一下个人信息。.yml
文件配置。
server:
port: 8080
oss:
qiniu:
url: http://zp.strivezhang.xyz // 七牛云URL连接(绑定的某个域名)
accessKey: ********* #秘钥AK
secretKey: ********* #秘钥SK
bucketName: haiwai-strivepeng-typora #仓库名(存储空间的名称)
通过@ConfigurationProperties(prefix = "oss.qiniu")
将配置文件中的相关配置项自动解析并绑定到类属性上面。
@Data
@ConfigurationProperties(prefix = "oss.qiniu")
@Component
public class QiNiuYunConfig {
private String url;
private String accessKey;
private String secretKey;
private String bucketName;
}
public class StringUtil { public static String getRandomImgName(String fileName){ // 获取文件后缀 int index = fileName.lastIndexOf('.'); String suffix = fileName.substring(index); // 校验文件 if(".jpg".equals(suffix) || ".jpeg".equals(suffix) || ".png".equals(suffix)){ //改变上传到服务器的文件名 uuid + suffix // 生成UUID String uuid = UUID.randomUUID().toString().replaceAll("-", ""); String path = uuid + suffix; return path; }else{ throw new IllegalArgumentException(); } } }
配置时,关于 Zone 的相关配置,其中关于Region对象和机房的关系如下:
机房 | Region |
---|---|
华东 | Region.region0(), Region.huadong() |
华北 | Region.region1(), Region.huabei() |
华南 | Region.region2(), Region.huanan() |
北美 | Region.regionNa0(), Region.beimei() |
东南亚 | Region.regionAs0(), Region.xinjiapo() |
注意:
- 若不指定 Region 或 Region.autoRegion() ,则会使用 自动判断 区域,使用相应域名处理。
- 如果可以明确 区域 的话,最好指定固定区域,这样可以少一步网络请求,少一步出错的可能。
- 不指定文件上传的 Key 的时候,将以文件的 hash 值作为文件名
基本的流程如下:
init()
Token
BufferedImage
对象,获取长宽属性"/img"+ "文件名"
的方式可以上传到指定空间的不同文件夹下getPrivateFile(String fileKey)
@Service public class UploadImgService { private QiNiuYunConfig qiNiuYunConfig; private UploadManager uploadManager; private String token; private Auth auth; private BucketManager bucketManager; public UploadImgService(QiNiuYunConfig qiNiuYunConfig){ this.qiNiuYunConfig = qiNiuYunConfig; init(); } private void init() { uploadManager = new UploadManager(new Configuration(Zone.zoneNa0())); auth = Auth.create(qiNiuYunConfig.getAccessKey(), qiNiuYunConfig.getSecretKey()); // 生成上传的token bucketManager = new BucketManager(auth, new Configuration(Zone.zoneNa0())); token = auth.uploadToken(qiNiuYunConfig.getBucketName()); } /** * 上传文件 */ public String uploadQNImg(MultipartFile file) { String resultImage = "失败"; try { // 判断图片后缀,并使用工具类根据上传文件生成唯一图片名称,防止截断字符如“%00” String fileName = file.getOriginalFilename(); String imgName = StringUtil.getRandomImgName(fileName); //判断是否为恶意程序 //通过流的方式把文件转换为BufferedImage对象,获取宽和高,只有图片才具有宽高属性 BufferedImage bufferedImage = ImageIO.read(file.getInputStream()); if(bufferedImage == null || bufferedImage.getHeight()==0 || bufferedImage.getWidth()==0){ return resultImage; } // 上传图片文件 Response res = uploadManager.put(file.getInputStream(), "sky/"+imgName, token, null, null); if (!res.isOK()) { throw new RuntimeException("上传七牛出错:" + res.toString()); } // 直接返回外链地址 return getPrivateFile(imgName); } catch (QiniuException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return "失败"; } /** * 获取私有空间文件 * */ public String getPrivateFile(String fileKey) { String encodedFileName = null; String finalUrl = null; try { encodedFileName = URLEncoder.encode(fileKey, "utf-8").replace("+", "%20"); String publicUrl = String.format("%s/%s", this.qiNiuYunConfig.getUrl(), encodedFileName); //1小时,可以自定义链接过期时间 long expireInSeconds = 3600; finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return finalUrl; } }
@RestController @RequestMapping("/qiniu") public class UploadImageController { @Autowired private UploadImgService uploadImgService; @PostMapping("/image") public String upLoadImg(@RequestBody MultipartFile file){ String result = "失败"; if(!file.isEmpty()){ String path = uploadImgService.uploadQNImg(file); if(path.equals(result)){ return "上传失败"; }else{ System.out.println("七牛云返回的图片链接是:" + path); return "上传成功:"+path; } } return "上传失败"; } }
文件上传分为客户端上传(主要是指网页端和移动端等面向终端用户的场景)和服务端上传两种场景,具体可以参考文档业务流程。
服务端SDK在上传方面主要提供两种功能
客户端(移动端或者Web端)上传文件的时候,需要从客户自己的业务服务器获取上传凭证,而这些上传凭证是通过服务端的SDK来生成的,然后通过客户自己的业务API分发给客户端使用。根据上传的业务需求不同,七牛云Java SDK支持丰富的上传凭证生成方式。以下是一些官方给出的上传方式:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。