本人微信公众号:前端修炼之路,欢迎关注

最近做项目的时候有一个上传图片的需求,由于没有后端的配合,所以决定自己来搭个服务器,实现上传图片功能。以后如果需要修改成java或者php为后端,直接使用即可,而不用等到后端联调的时候再去动手。

这里使用的技术为node.js + qiniu nodeJS SDK+ qiniu JS SDK + express + html5

1. 安装express 和 qiniu

首先需要安装node.js,然后新建一个目录在目录下面依次执行下面的命令


cnpm init
cnpm install express --save
cnpm install qiniu --save

说明:

  • 使用了cnpm替换npm命令,这是因为前者会比后者更快一些。
  • 第一条命令会在目录下创建一个package.json文件,然后在命令行中一路回车就好。
  • 在命令后面添加--save可以在package.json文件的dependencies属性中,将express和qiniu添加上。这样以后换一个目录,在没有node_modules目录时,直接使用npm install就可以安装了。

2.配置七牛 AccessKey/SecretKey

首先肯定是要注册一个七牛账号的。可以点我的分享链接直接注册:https://portal.qiniu.com/sign...

创建一个七牛存储空间,这里假设空间名字为qiniu_test

在个人中心中,找到密钥管理,创建一个密钥。之后就会生成一个accessKey和secretKey。

回到项目目录下,创建一个config.json,将下面的内容粘贴进去


{
"AccessKey": "<Your Access Key>", // https://portal.qiniu.com/user/key
"SecretKey": "<Your Secret Key>",
"Bucket": "<Your Bucket Name>",
"Port": 9000,
"UptokenUrl": "uptoken",
"Domain": "<Your Bucket Domain>" // bucket domain eg:http://qiniu-plupload.qiniudn.com/
}

需要替换其中的AccessKey和SecretKey。然后修改Bucket值为刚才创建的qiniu_test。其中的Domain,可以在空间概述中找到一个类似http://qiniu-plupload.qiniudn.com这样域名。以后访问文件的时候,就可以通过这个域名来访问的。

3.配置服务

在项目目录中创建一个server.js,将下面的内容拷贝其中。然后我逐一解释下。


var express = require('express');
var fs = require('fs');
var path = require('path');
var qiniu = require('qiniu'); var app = express();
var config = JSON.parse(fs.readFileSync(path.resolve(__dirname, "config.json")));
var mac = new qiniu.auth.digest.Mac(config.AccessKey, config.SecretKey); var putExtra = new qiniu.form_up.PutExtra();
var options = {
scope: config.Bucket,
deleteAfterDays: 1,
returnBody: '{"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}'
}; var putPolicy = new qiniu.rs.PutPolicy(options);
var bucketManager = new qiniu.rs.BucketManager(mac, config); app.get('/index.html', function(req, res) {
res.sendFile(__dirname + "/" + "index.html");
}); app.get('/api/getImg', function(req, res) {
var options = {
limit: 5,
prefix: 'image/test/',
marker: req.query.marker
};
bucketManager.listPrefix(config.Bucket, options, function(err, respBody, respInfo) {
if(err) {
console.log(err);
throw err;
} if(respInfo.statusCode == 200) {
var nextMarker = respBody.marker || '';
var items = respBody.items;
res.json({
items: items,
marker: nextMarker
});
} else {
console.log(respInfo.statusCode);
console.log(respBody);
}
});
}); app.get('/api/uptoken', function(req, res) {
// res.send('Hello World!'); var token = putPolicy.uploadToken(mac);
res.header("Cache-Control", "max-age=0, private, must-revalidate");
res.header("Pragma", "no-cache");
res.header("Expires", 0);
if(token) {
res.json({
uptoken: token,
domain: config.Domain
});
}
}); var server = app.listen(3000, function() {
var host = server.address().address;
var port = server.address().port; console.log('Example app listening at http://%s:%s', host, port);
});
  • 要想往七牛云空间上传图片,一定要用到token这个参数。这个token是通过后端服务器获取出来的,因为我用的是node.js所以用qiniu的nodeJS SDK,如果是其他后端语言,就可以选择别的SDK。
  • 获取这个token需要根据之前配置好的AccessKey和SecretKey。所以通过fs.readFileSync把config.json这个文件中的配置项获取出来。
  • express 就可以接受前端的请求。因为上传之前必须要token,所以提供一个借口api/uptoken,向前端返回拼接好的token字符串。

4.添加测试页面

在项目目录下创建一个index.html,将如下内容拷贝其中


<!DOCTYPE html>
<html> <head>
<meta charset="UTF-8">
<title>index.html</title>
<script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
<script src="https://unpkg.com/qiniu-js@2.5.1/dist/qiniu.min.js"></script>
</head> <body>
<h1>测试七牛云上传图片</h1>
<form action="upload" method="post" enctype="multipart/form-data">
<input class="file-input" type="file" id="select" />
</form>
<div id="result"> </div>
<button onclick="clickButton()">请求图片</button>
<div id="pics"></div>
<script type="text/javascript">
var result;
var fileName;
var domain = 'http://siberiawolf.qiniudn.com/'; var complete = function(res){
$('#result').html('<img src='+result.domain+'/'+fileName+' />');
} var subObject = {
// next: next,
// error: error,
complete: complete
}; $.ajax({
type: "get",
url: "/api/uptoken",
async: true,
success: function(res) {
result = res;
}
}); $('#select').on('change', function() {
var file = this.files[0];
fileName = 'image/test/'+file.name;
var token = result.uptoken;
var domain = result.domain;
var config = {
useCdnDomain: true,
disableStatisticsReport: false,
retryCount: 6,
region: qiniu.region.z0
};
var putExtra = {
fname: "",
params: {},
mimeType: null
};
var observable = qiniu.upload(file, fileName, token, putExtra, config); var subscription = observable.subscribe(subObject);
});
var marker = '';
function clickButton(){
$.ajax({
type: "get",
url: "/api/getImg",
async: true,
data:{
marker: marker
},
success: function(res) {
var items = res.items;
marker = res.marker;
var html = '';
items.forEach(function(val, index){
html += '<img src='+domain+val.key+' />'
});
$('#pics').html(html);
}
});
}
</script>
</body> </html>
  • 上传之前必须要获取到token,所以先请求了一下接口。
  • 通过指定qiniu.upload第二个参数,并添加文件路径前缀,将图片路径区分开。
  • 获取图片列表,用的是qiniu提供的api。

5.启动服务

node server.js启动服务,然后访问index.html页面即可。

来源:https://segmentfault.com/a/1190000017064729

最新文章

  1. Java 之 GUI
  2. ASP.NET MVC过滤器(一)
  3. java web项目中classes文件夹下的class和WEB-INF/lib中jar里的class文件加载顺序
  4. Java thread中对异常的处理策略
  5. Java线程中yield()的用法
  6. 阿里云开发之OSS数据迁移
  7. 201521123067 《Java程序设计》第3周学习总结
  8. 【线段树】Bzoj1798 [AHOI2009] 维护序列
  9. mysql的SQL集锦
  10. Shell 数组定义与获取
  11. Unity 之 自定义消息提示框
  12. (转) HighCharts 非规律日期 多条曲线的 绘画
  13. 阿里云RDS数据库备份文件恢复到本地数据库
  14. KnockoutJs学习笔记(八)
  15. [转]资深CTO:关于技术团队打造与管理的10问10答
  16. abap 中modify 的使用
  17. 整理javascript基础
  18. Faster RCNN论文解析
  19. BZOJ4137 & 洛谷4585:[FJOI2015]火星商店问题
  20. Jmeter 重要测试指标释义

热门文章

  1. 用户空间和内核空间通讯之【Netlink 上】
  2. 自编自演的Linux脚本
  3. 【音乐App】—— Vue-music 项目学习笔记:播放器内置组件开发(二)
  4. 测试整合之王Unitils
  5. centos网络配置实例
  6. RPi Cam v2 之一:基础及牛刀小试
  7. ie下div模拟的表格,表头表体无法对齐
  8. js 中文校验并过滤掉中文
  9. Ubuntu下载、zsync、安装、常见问题
  10. hdu4857 & BestCoder Round #1 逃生(拓扑逆排序+优先队列)