node+express上传图片到七牛

简介: 本人微信公众号:前端修炼之路,欢迎关注最近做项目的时候有一个上传图片的需求,由于没有后端的配合,所以决定自己来搭个服务器,实现上传图片功能。
本人微信公众号: 前端修炼之路,欢迎关注

最近做项目的时候有一个上传图片的需求,由于没有后端的配合,所以决定自己来搭个服务器,实现上传图片功能。以后如果需要修改成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

相关文章
|
7月前
|
前端开发 JavaScript NoSQL
使用 Node.js、Express 和 React 构建强大的 API
本文详细介绍如何使用 Node.js、Express 和 React 构建强大且动态的 API。从开发环境搭建到集成 React 前端,再到利用 APIPost 高效测试 API,适合各水平开发者。内容涵盖 Node.js 运行时、Express 框架与 React 库的基础知识及协同工作方式,还涉及数据库连接和前后端数据交互。通过实际代码示例,助你快速上手并优化应用性能。
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
JavaScript
使用node.js搭建一个express后端服务器
Express 是 Node.js 的一个库,用于搭建后端服务器。本文将指导你从零开始构建一个简易的 Express 服务器,包括项目初始化、代码编写、服务启动与项目结构优化。通过创建 handler 和 router 文件夹分离路由和处理逻辑,使项目更清晰易维护。最后,通过 Postman 测试确保服务正常运行。
797 1
|
Web App开发 JavaScript 前端开发
探索后端开发:Node.js与Express的完美结合
【10月更文挑战第33天】本文将带领读者深入了解Node.js和Express的强强联手,通过实际案例揭示它们如何简化后端开发流程,提升应用性能。我们将一起探索这两个技术的核心概念、优势以及它们如何共同作用于现代Web开发中。准备好,让我们一起开启这场技术之旅!
253 0
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的融合之道
【10月更文挑战第31天】在追求快速、灵活和高效的后端开发领域,Node.js与Express框架的结合如同咖啡遇见了奶油——完美融合。本文将带你探索这一组合如何让后端服务搭建变得既轻松又充满乐趣,同时确保你的应用能够以光速运行。
252 0
|
4月前
|
JavaScript Unix Linux
nvm与node.js的安装指南
通过以上步骤,你可以在各种操作系统上成功安装NVM和Node.js,从而在不同的项目中灵活切换Node.js版本。这种灵活性对于管理不同项目的环境依赖而言是非常重要的。
1078 11
|
9月前
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
Node.js 是一种高效的 JavaScript 运行环境,基于 Chrome V8 引擎,支持在服务器端运行 JavaScript 代码。本文介绍如何在阿里云上一键部署 Node.js 环境,无需繁琐配置,轻松上手。前提条件包括 ECS 实例运行中且操作系统为 CentOS、Ubuntu 等。功能特点为一键安装和稳定性好,支持常用 LTS 版本。安装步骤简单:登录阿里云控制台,选择扩展程序管理页面,安装 Node.js 扩展,选择实例和版本,等待创建完成并验证安装成功。通过阿里云的公共扩展,初学者和经验丰富的开发者都能快速进入开发状态,开启高效开发之旅。
|
8月前
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
7450 23
下一篇
oss云网关配置