在使用FastDFS做文件上传之后,想起之前看人人开源的时候用七牛云配置过云储存,但是当时界面都是写好的,直接在界面上配就好,这次就想用java代码实现一次。
效果展示
实现步骤
第一步:引入依赖
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.2.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.3.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.6.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>happy-dns-java</artifactId>
<version>0.1.4</version>
<scope>compile</scope>
</dependency>
第二步:在application.yml中配置(当然,也可以直接在services里面写)
qiniu:
accesskey: 你的accesskey
secretkey: 你的secretkey
bucket: 你的bucket
第三步:编写配置文件的实体类
@Data
@ConfigurationProperties(prefix = "qiniu")
public class SysOSSConfig {
String accesskey;
String secretkey;
String bucket;
String cdns;
}
第四步:编写Controller
@RestController
@RequestMapping("upload")
public class LyUploadController {
@Autowired
private LyUploadService lyUploadService;
@Autowired
private SysOSSUploadService sysOSSUploadService;
@PostMapping("image")
public ResponseEntity uploadImage(@RequestParam("file") MultipartFile file) throws IOException {
byte[] imgBytes = file.getBytes();
//MultipartFile 转 字节数组
String imgUrl = sysOSSUploadService.fileUpload(imgBytes);
return ResponseEntity.ok(imgUrl) ;
}
}
在这里要注意,由于前端代码如下,在这里返回的是一个URL
data() {
return {
baseUrl: config.api,
valid:false,
brand: {
name: "",
image: "",
letter: "",
categories: []
},
imageDialogVisible:false
}
之前我创建一个map,来接收前端传过来的file,但是转成了字节数组再放进map,所以一直没办法传进去并且在服务器端报错。
Map map = new HashMap<>();
map.put("imgUrl",imgUrl);
第五步:编写Services层(核心层)
@Service
@EnableConfigurationProperties(SysOSSConfig.class)
public class SysOSSUploadService {
public String fileUpload(byte[] data){
//图片的外链地址
StringBuffer imgUrl = new StringBuffer("你的图片外链地址");
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone2());
UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传
//默认不指定key的情况下,以文件内容的hash值作为文件名
String key = null;
Auth auth = Auth.create("你的accesskey", "你的secretkey");
String upToken = auth.uploadToken("你的bucket");
try {
//上传文件
Response response = uploadManager.put(data,key,upToken);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
imgUrl.append(putRet.key);
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
return imgUrl.toString();
}
}
在这里有几个地方需要注意
一.
* 华东 Zone.zone0()
* 华北 Zone.zone1()
* 华南 Zone.zone2()
* 北美 Zone.zoneNa0()
需要到你的七牛云控制台查看储存地区,并根据储存地区修改配置
二. StringBuffer imgUrl = new StringBuffer(" 图片的外链地址");
如果在这里不知道怎么配(因为在七牛云可能会配置加速域名),可以在你的七牛云上传一张图片,复制出外链地址,外链前半部分就是你在这里需要配的。