七牛——文件上传与网络资源抓取

七牛

七牛是一个很神奇的东西,每个月10G的流量,方便快捷的上传、获取资源,不论在什么情景下,处理用户上传的较小的文件,七牛不仅缓解了服务器的压力,更方便快捷地完成这些操作!

七牛开发者中心有更完整详细的文档介绍,接下来写的是在Web上处理客户端的文件上传和讲网络资源抓取到七牛空间

文件上传

上传机制:客户端对文件进行上传,先向服务器发送请求,服务器返回凭证给客户端,客户端用凭证找到对应的七牛空间并把文件存在既定的位置,然后七牛返回处理结果给客户端。

七牛

所以在文件上传中最重要的 accessKeysecretKey ,它们是生成上传token的关键,七牛的每个用户都会有唯一的 accessKeysecretKey

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// token.js
const qiniu = require('qiniu')
, ak = ' '
, sk = ' '
, mac = new qiniu.auth.digest.Mac(ak, sk);
let token = () => {
let options = {
scope: 'bucket',
// expires:
}
let putPoily = new qiniu.rs.PutPolicy(options);
let token = putPoily.uploadToken(mac);
return token;
}
module.exports = token;

token.js 封装了凭证的获取,bucket 是七牛中存储的库,expires 是设置token的过期时间,默认为3600ms(一小时)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// upload.js
const express = require('express')
, router = express.Router()
, qiniu = require('qiniu')
, token = require('./token')
, uuid = require('uuid/v4')
router.get('/', (req, res) => {
let file_key = 'xxx' + uuid();
res.render('index', {
token: token(),
key: file_key
})
});
router.get('/token', function(req, res){
res.json({
code: 200,
msg: 'success'
});
})
module.exports = router;
1
2
3
4
5
6
7
<form class="form-style" method="post" action="http://up-z2.qiniu.com" enctype="multipart/form-data">
<input name="key" value="<%= key %>">
<input name="token" value="<%= token %>">
<input name="file" type="file" />
<button type="submit">提交</button>
</form>

upload.js 中的 key 是指在 bucket 中文件的命名,并用了 Experss 框架将数据渲染给 ejs 中的表单,表单中的 keytokenfile是必需的元素,这是最简单地构成上传的表单,其余更多的元素在开发者文档中慢慢摸索,如此即可将文件上传到七牛指定的 bucket 中以既定的 key 存储。

网络资源抓取

七牛自身提供了途径去换取网络资源并将网络资源存储在七牛空间,这样就可以当资源下载慢的时候,交给七牛去下载并存储,缓解服务器压力。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
const express = require('express')
, router = express.Router()
, uuid = require('uuid/v4')
, qiniu = require('qiniu')
, ak = ' '
, sk = ' '
, mac = new qiniu.auth.digest.Mac(ak, sk)
, config = new qiniu.conf.Config();
config.zone = qiniu.zone.Zone_z2;
router.get('/', function(req, res){
res.render('manager');
})
router.post('/', function(req, res){
let bucket = 'xxx'
, key = 'xxx/' + uuid()
, resUrl = req.body.url;
let bucketManager = new qiniu.rs.BucketManager(mac, config)
bucketManager.fetch(resUrl, bucket, key, (err, respBody, respInfo) => {
if(err){
console.log(err);
} else {
if(respInfo.statusCode === 200){
console.log('key: ' + respBody.key);
console.log('hash: ' + respBody.hash);
console.log('fsize: ' + respBody.fsize);
console.log('mimeType: ' + respBody.mimeType);
console.log("网络资源抓取完成!");
res.render('suc', {
respBody: respBody
});
} else {
console.log(respInfo.statusCode);
console.log(resBody);
}
}
});
});
module.exports = router;

此处还是用到了 Express 框架,主要是获取资源的 Url 和渲染结果;对网络资源的抓取是不需要生成 token,但也是需要 accessKeysecretKey, 接着是存储的库 bucket 和命名 key,需要的东西都已经封装好了,直接调用就可以抓取网络资源。

结语

七牛自身提供了很多接口,所以开发者利用七牛进行对象存储的时候很方便,以上写的文件上传和抓取网络资源是比较常见也是比较简单的例子;七牛是个神奇的东西!