首先得去七牛云注册账号,然后去控制台创建存储空间
这里申请的是测试域名,所以只有30天的有效期,到期了图片就会被清除。所以只是供我们玩一下,真正的开发得用自己的域名。
接下来就是申请AK和SK,在个人中心
做好了这些准备,那么就可以开始写代码了。
我这里使用的是SpringBoot,这样可以省去很多配置,在这个项目中,几乎是零配置。
图片上传,这里需要两个jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.2.7</version>
</dependency>
接下来就开始撸代码了。
首先创建一个html页面
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/testUpload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">上传</button>
</form>
</body>
</html>
最简单原始。但这里还是有两个注意的地方,一个是method属性,一个是enctype属性。
接下来就是FileUtil.java
public class FileUtil {
// 图片允许的后缀扩展名
public static String[] IMAGE_FILE_EXTD = new String[] { "png", "bmp", "jpg", "jpeg","pdf" };
public static boolean isFileAllowed(String fileName) {
for (String ext : IMAGE_FILE_EXTD) {
if (ext.equals(fileName)) {
return true;
}
}
return false;
}
}
这个类只有一个简单的方法,那就是判断图片的后缀是否符合要求。
接下来写QiniuService.java
@Service
public class QiniuService {
private static final Logger logger = LoggerFactory.getLogger(QiniuService.class);
// 设置好账号的ACCESS_KEY和SECRET_KEY
String ACCESS_KEY = "###################";
String SECRET_KEY = "###################";
// 要上传的空间
String bucketname = "####";
// 密钥配置
Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
// 构造一个带指定Zone对象的配置类,不同的七云牛存储区域调用不同的zone
Configuration cfg = new Configuration(Zone.zone0());
// ...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
// 测试域名,只有30天有效期
private static String QINIU_IMAGE_DOMAIN = "http://############/";
// 简单上传,使用默认策略,只需要设置上传的空间名就可以了
public String getUpToken() {
return auth.uploadToken(bucketname);
}
public String saveImage(MultipartFile file) throws IOException {
try {
int dotPos = file.getOriginalFilename().lastIndexOf(".");
if (dotPos < 0) {
return null;
}
String fileExt = file.getOriginalFilename().substring(dotPos + 1).toLowerCase();
// 判断是否是合法的文件后缀
if (!FileUtil.isFileAllowed(fileExt)) {
return null;
}
String fileName = UUID.randomUUID().toString().replaceAll("-", "") + "." + fileExt;
// 调用put方法上传
Response res = uploadManager.put(file.getBytes(), fileName, getUpToken());
// 打印返回的信息
if (res.isOK() && res.isJson()) {
// 返回这张存储照片的地址
return QINIU_IMAGE_DOMAIN + JSONObject.parseObject(res.bodyString()).get("key");
} else {
logger.error("七牛异常:" + res.bodyString());
return null;
}
} catch (QiniuException e) {
// 请求失败时打印的异常的信息
logger.error("七牛异常:" + e.getMessage());
return null;
}
}
}
这里需要填的地方我都用#########标注了,要注意的是Zone.zone0()这个方法,因为你创建的存储空间可能是华北的,华东的或者其他区域的,所以这里可能得调用zone1或者zone2。具体视情况而定。
最后当然就是controller了。
@Controller
public class TestController {
@Autowired
private QiniuService qiniuService;
@RequestMapping(value = "/testUpload", method = RequestMethod.POST)
@ResponseBody
public String uploadImage(@RequestParam("file") MultipartFile file,HttpServletRequest request) {
if(file.isEmpty()) {
return "error";
}
try {
String fileUrl=qiniuService.saveImage(file);
return "success, imageUrl = " + fileUrl;
} catch (IOException e) {
e.printStackTrace();
}
return "fail";
}
}
上传成功,则返回图片的地址。
启动SpringBoot项目,输入地址
选择一张图片点击上传,发现返回success和图片的url。
去七牛云存储空间看内容管理,发现图片已经上传到了七牛云。