node.js实现图片上传
两步走战略:
- 将图片上传到服务器
- 将图片的路径保存到数据库
图片上传到服务器
- 下载第三方插件multer
npm install multer --save
- 先写一个上传图片的接口
在路由文件夹中创建一个upload.js文件:
const express=require('express');
const router=express.Router();
//上传图片的模板
var multer=require('multer');
//生成的图片放入uploads文件夹下
var upload=multer({dest:'uploads/'})
//图片上传必须用post方法
router.post('/img',upload.single('test'),(req,res)=>{console.log(req.file);res.send('upload img')
})
module.exports=router;
在服务器端server.js文件中:
const express = require('express')
var bodyParser = require('body-parser')
const app = express()
const cors=require('cors')
app.use(cors())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
// 配置静态资源目录 整一个文件夹 通过域名能访问
app.use(express.static(path.join(__dirname,"../static")))
//数据模型
//路由配置
const upload=require('./router/upload.js');
app.use('/upload',upload)
app.listen(80, () => console.log("服务器开启"))
设置完之后图片上传的接口为:http://127.0.0.1/upload/img
(可通过postman测试一下)
一起来看一下打印的req.file里面有些什么
上传的图片是一堆二进制码,不能查看,怎么办呢?我们可以用原文件名(originalname)拼接一个可访问路径呀
router.post('/img',upload.single('test'),(req,res)=>{//读取路径(req.file.path)fs.readFile(req.file.path,(err,data)=>{//读取失败,说明没有上传成功if(err){return res.send('上传失败')} //否则读取成功,开始写入//我们先尝试用原文件名originalname写入吧// 三个参数//1.图片的绝对路径//2.写入的内容//3.回调函数 fs.writeFile(path.join(__dirname,'../../static/img/'+req.file.originalname),data,(err)=>{if(err){return res.send('写入失败')}res.send({err:0,msg:'上传ok'})})})
})
module.exports=router;
能成功看到图片了,而不再是二进制的形式。
但是呢,这样有个弊端,如果上传的文件名一样,后面上传的图片会把前面上传的图片覆盖。
所以我们应该保证图片名的唯一性,可以通过时间戳+随机数的方式来尽量保证唯一性
//声明图片名字为时间戳和随机数拼接成的,尽量确保唯一性let time=Date.now()+parseInt(Math.random()*999)+parseInt(Math.random()*2222);//拓展名let extname=req.file.mimetype.split('/')[1]//拼接成图片名let keepname=time+'.'+extname //绝对路径就可以写成以下形式path.join(__dirname,'../../static/img/'+keepname)
完整代码:
const express=require('express');
const router=express.Router();
const fs=require('fs');
const path=require('path');
//上传图片的模板
var multer=require('multer');
//生成的图片放入uploads文件夹下
var upload=multer({dest:'uploads/'})
//图片上传必须用post方法
router.post('/img',upload.single('test'),(req,res)=>{//读取文件路径fs.readFile(req.file.path,(err,data)=>{//如果读取失败if(err){return res.send('上传失败')}//如果读取成功//声明图片名字为时间戳和随机数拼接成的,尽量确保唯一性let time=Date.now()+parseInt(Math.random()*999)+parseInt(Math.random()*2222);//拓展名let extname=req.file.mimetype.split('/')[1]//拼接成图片名let keepname=time+'.'+extname//三个参数//1.图片的绝对路径//2.写入的内容//3.回调函数fs.writeFile(path.join(__dirname,'../../static/img/'+keepname),data,(err)=>{if(err){return res.send('写入失败')}res.send({err:0,msg:'上传ok'})});});
})
module.exports=router;
将图片上传服务器ok啦!!!
将图片的路径保存到数据库
我们来想一想应该把什么保存在数据库中,相对路径还是绝对路径??
首先肯定不能把绝对路径保存到数据库中,一个ip可以有多个域名,虽然ip换不了,但是域名能换,如果整体存进去下次域名不同就会导致不能访问了。
那我们就得用相对路径了,相对路径存哪部分呢?
比如我填一个表格需要上传图片,可以先不存入数据库,先调用一个上传图片的接口,把相对路径返回给前端,前端可通过拼接的方式获取图片,再把表格中的其他数据及这个图片的相对路径一起放入数据库中。
(上传成功之后再传一个相对路径给前端)
res.send({err:0,msg:'上传ok',data:'/img/'+keepname})
接口跑通啦!!!
前端部分
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title><style>img{width: 50px;height: 50px;}</style><script src="../js/jquery.js"></script>
</head>
<body><input type="file" name='image' id="imagelist"><img src=""><button onclick="Req_ajax()"> 上传</button>
<script>var OL_Action_Root = "http://127.0.0.1";
function Req_ajax()
{ console.log(111)console.log($("#imagelist")[0].files)// 获取file域里的图片信息var formData = new FormData()//创建formdata对象formData.append("test",$("#imagelist")[0].files[0]) // 将文件信息 append 进入formdata对象 key值 为后台 single 设置的值 $.ajax({url: OL_Action_Root+'/upload/img',type: 'POST',data: formData,cache: false,contentType: false,processData: false,success: function(data){if (data.err==0) {$('img').attr('src',OL_Action_Root+data.data)}},error: function(jqXHR, textStatus, errorThrown){document.getElementById("status").innerHTML = "<span style='color:#EF0000'>连接不到服务器,请检查网络!</span>";}});
}</script>
</body>
</html>
让我们一起来看一下最终实现效果:
node.js实现图片上传相关推荐
- node.js实现图片上传(包含缩略图)
图片上传 使用multiparty插件实现上传 安装multiparty npm i --save multiparty 代码实现 const multiparty = require('multip ...
- 使用Node.js express 开发上传文件/图片api接口
我是傲夫靠斯,欢迎关注我的公众号[前端工程师的自我修养],每天更新. 今天我们来搞一个Node.js Express的上传文件功能,我使用了busboy这个库. Busboy是一个基于事件的文件流解析 ...
- node.js实现formdata上传文件
node.js实现formdata上传文件 1.关于formdata XMLHttpRequest Level 2 添加了一个新的接口--FormData.利用 FormData 对象,我们可以通过 ...
- 如何上传图片到fileupload空间_如何用原生js写图片上传组件v2.0(还有新版本)?...
js图片上传组件: 基本要求: 1.上传的图片可预览,可删除,可被覆盖更新 2.要求图片格式为jpg和png,大小不能超过2M 新加需求: 1.模拟回显,可用本地存储(实际上的回显是通过后台传过来的u ...
- js实现图片上传预览及进度条
js实现图片上传预览及进度条 原文js实现图片上传预览及进度条 最近在做图片上传的时候,由于产品设计的比较fashion,上网找了比较久还没有现成的,因此自己做了一个,实现的功能如下: 1:去除浏览器 ...
- js实现图片上传预览功能
js实现图片上传预览功能 很多业务场景下,我们需要在用户上传图片前,先预览待上传的图片 <body><input type="file"><img s ...
- 前端js实现图片上传
前端js实现图片上传的原理是通过input标签的type=file属性将input标签定义为上传文件,对input进行onchange事件的监听,当input的value值改变时代表用户已经上传了图片 ...
- 手机端移动端的前端原生js裁剪图片上传
手机端移动端的前端原生js裁剪图片上传 选择头像时裁剪上传,确保图片是个正方形,不会出现压扁拉伸的现象 效果图 原理很简单,其实就是用canvas截图出来而已,只是要对比例做一下处理. <!-- ...
- 关于editor网页编辑器ueditor.config.js 配置图片上传
最近公司项目在做一个门户网站,其中新闻和简介等部分使用到了ueditor编辑器,但是上级明确指示需要图片上传这个功能,这时却发现图片上传功能不能正常使用,上传时一直报错,网上收了好几个处理办法,都说的 ...
最新文章
- MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)
- ProE常用曲线方程:Python Matplotlib 版本代码(玫瑰曲线)
- Makefile中几种赋值
- 使用 keytool 生成安卓应用程序签名
- Xcode中指令集相关选项
- foxmail地址簿怎么添加分组 foxmail地址簿新建分组的教程
- PHP出现 Notice: Undefined index:...的原因及解决办法
- 穷人变富的过程中,最大的阻碍是什么?
- matlab 点顺时针排序,怎样对平面中的点进行顺时针或者逆时针排序
- 注销公司是否需要办理注销呼叫中心许可证?
- 这5个优质动漫网站,能让你瞬间爆棚,都是满满的干货
- Java使用openOffice转PDF以及PDF文件预览乱码问题
- Android 手机设备信息获取使用详解
- 滤波笔记三:无迹卡尔曼滤波(UKF)
- docker如何查看宿主机到容器端口映射
- tf.keras.layers.BatchNormalization、tf.keras.layer.LayerNormalization函数
- 动手做个VR眼镜,找回童年的感觉
- 搭建linux服务器网络代理
- 空之轨迹激活显示服务器错误,空之轨迹OL黑屏闪退原因及解决方法一览
- 2022年化工自动化控制仪表最新解析及化工自动化控制仪表免费试题