Node.js 上传图片并保存
Node.js 上传图片并保存
依赖
package.json 文件
{
"name": "demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"dependencies": {
"formidable": "^1.2.1",
"koa": "^2.5.1",
"koa-body": "^2.6.0",
"koa-logger": "^3.2.0",
"koa-router": "^7.4.0",
"koa-static-cache": "^5.1.2"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
主功能代码
const Koa = require('koa')
const logger = require('koa-logger')
const router = require('koa-router')()
const formidable = require('formidable')
const koaBody = require('koa-body')
const util = require('util')
const path = require('path')
const staticCache = require('koa-static-cache')
const fs = require('fs')
const app = new Koa()
const port = 8080
app.use(logger()) // 输出日志
app.use(koaBody()) // body 解析
// 设置img 目录为静态资源
app.use(staticCache(path.join(__dirname, 'img'), {
maxAge: 365 * 24 * 60 * 60,
gzip: true,
buffer: true,
dynamic: true
}))
router
// 首页
.get('/', ctx => {
ctx.body =
'<form action="/upload" enctype="multipart/form-data" method="post">' +
'<input type="text" name="title"><br>' +
'<input type="file" name="upload" multiple="multiple"><br>' +
'<input type="submit" value="Upload">' +
'</form>'
})
// 上传文件接口
.post('/upload', async ctx => {
const form = new formidable.IncomingForm()
// 设置存储文件的目录
const imgPath = path.join(__dirname, '/img')
// 如果目录不存在则创建
if (!fs.existsSync(imgPath)) fs.mkdirSync(imgPath)
form.uploadDir = imgPath
// 上传文件大小限制
form.maxFieldsSize = 20 * 1024 * 1024
let result = await new Promise(r => {
form.parse(ctx.req, function (err, fields, files) {
if (err) {
r({ err })
} else {
// 手动给文件加后缀, formidable默认保存的文件是无后缀的
let newPath = files.upload.path + '_' + files.upload.name
fs.renameSync(files.upload.path, newPath)
r({ path: newPath })
}
})
})
const basename = '/' + path.basename(result.path)
if (result.err) ctx.throw(400, '异常错误')
else ctx.body = `<p>url: ${basename}</p><img src=${basename} style="max-width: 100%;">`
})
app.use(router.routes())
app.on('error', (err, ctx) => {
log.error('server error', err, ctx)
})
app.listen(port, () => {
console.log('listen ', port)
})
运行
node .
Node.js 上传图片并保存的更多相关文章
- node.js 上传图片
依赖库 connect,gm,imagemagick,image-size connect:中间件 gm,imagemagick:用来处理图片如缩放.切割.添加文字水印等 image-szie:获取图 ...
- 上传图片到七牛云(服务端 node.js sdk)
大体思路 前端要上传图片到七牛云,需要有一个token进行授权操作,而获取这个上传的upload token(以下简称upToken),在服务端需要一定的身份校验,比如说:只有登录的vip用户才能拿到 ...
- Node.js 使用http客户端向网站请求数据并保存
app.js代码: // 内置http模块,提供了http服务器和客户端功能 var http=require("http"); // 内置文件处理模块 var fs=requir ...
- Node.js 项目搭建
关于 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识.本书绝不是一本“Hello World”的教程. 状态 你正在阅读的已经是本书的最终版. ...
- [读书笔记]了不起的node.js+实践(一)
环境的变化带来了技术大跃进,机遇和挑战同时到来.基于我js也没有学,只好赶鸭子上架一起学了.(>﹏<) 1.先读读书 一开始就不知死活地看<深入浅出node.js>,弄得团团转 ...
- node.js系列笔记之node.js初识《一》
node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...
- 初学node.js有感三
WebStorm下的node.js 一.回顾与继续 在前面,我们知道了node.js的基本框架和思路,在这些原生环境下我们对node.js的设计思想有了比较深刻的认识,并且具有了编写大型程 ...
- 以太坊开发DApp实战教程——用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建电商平台(一)
第一节 简介 欢迎和我们一起来用以太坊开发构建一个去中心化电商DApp!我们将用区块链.星际文件系统(IPFS).Node.js和MongoDB来构建电商平台类似淘宝的在线电商应用,卖家可以自由地出售 ...
- node.js富文本编辑器
摘要: 最近在搭建自己的博客,这一段时间可能没有时间来写博客了,但是有了好东西还是要分享给大家.博客网站必然要有编辑文章的编辑器,所以在网上查了些资料.大部分编辑器的后台是基于java.php.asp ...
随机推荐
- 02.CSS动画示例-->鼠标悬停图片旋转
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- apache配置域名访问本地空间
1. 首先修改C盘WINDOWS\system32\drivers\etc目录下的 hosts 文件,用记事本打开,加入: 127.0.0.1 www.a.com hosts文件是用来解析的,你在浏览 ...
- CentOS6.5(3)----设置自己安装的程序开机自动启动
CentOS6.5系统下设置自己安装的程序开机自动启动 方法1. 把启动程序的命令添加到 /etc/rc.d/rc.local 文件中,比如设置开机启动 mysqld: #!/bin/sh # # T ...
- Android8.0适配那点事(二)
小伙伴们,咱们今天咱继续对Android8.0的适配进行分解,今天将针对启动页,版本适配和系统限制等进行“啃食” 猛戳这里查看Android8.0适配那点事(一): 1.启动页适配 近日,我无意中发现 ...
- cocos ide使用binding-generator导出来的c++类
time:2015/03/19 cocos版本:3.2 描述:用了ide运行一个实例[1]的时候需要增加c++类,正确导出来之后,直接使用vs2012启动是没有问题的,但是使用ide启动却提示找不到模 ...
- 【MySQL】MySQL数据库再安装
解决问题 安装时提示此产品配置信息损坏,怎么办? 环境检测时未响应,怎么办? 服务不能启动,怎么办? 输入密码不能登陆,不使用密码却能登录,是什么原因? 涉及到的错误代码:windows启动MySQL ...
- WCF已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性
<?xml version="1.0" encoding="utf-8"?> <configuration> <connectio ...
- layer 遮罩层等待
效果 代码: js函数之前:var msg = layer.msg('努力中加载中...', {icon: 16,shade: [0.5, '#f5f5f5'],scrollbar: false,of ...
- Kendo 计算字段
var Product = kendo.data.Model.define({ fields: { "quantity": { type: "number" } ...
- 有用的JS函数
1. QueryString function queryString(key) { var re = new RegExp("[?&]" + key + "=( ...