两步走战略:

  • 将图片上传到服务器
  • 将图片的路径保存到数据库

图片上传到服务器

  • 下载第三方插件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实现图片上传相关推荐

  1. node.js实现图片上传(包含缩略图)

    图片上传 使用multiparty插件实现上传 安装multiparty npm i --save multiparty 代码实现 const multiparty = require('multip ...

  2. 使用Node.js express 开发上传文件/图片api接口

    我是傲夫靠斯,欢迎关注我的公众号[前端工程师的自我修养],每天更新. 今天我们来搞一个Node.js Express的上传文件功能,我使用了busboy这个库. Busboy是一个基于事件的文件流解析 ...

  3. node.js实现formdata上传文件

    node.js实现formdata上传文件 1.关于formdata XMLHttpRequest Level 2 添加了一个新的接口--FormData.利用 FormData 对象,我们可以通过 ...

  4. 如何上传图片到fileupload空间_如何用原生js写图片上传组件v2.0(还有新版本)?...

    js图片上传组件: 基本要求: 1.上传的图片可预览,可删除,可被覆盖更新 2.要求图片格式为jpg和png,大小不能超过2M 新加需求: 1.模拟回显,可用本地存储(实际上的回显是通过后台传过来的u ...

  5. js实现图片上传预览及进度条

    js实现图片上传预览及进度条 原文js实现图片上传预览及进度条 最近在做图片上传的时候,由于产品设计的比较fashion,上网找了比较久还没有现成的,因此自己做了一个,实现的功能如下: 1:去除浏览器 ...

  6. js实现图片上传预览功能

    js实现图片上传预览功能 很多业务场景下,我们需要在用户上传图片前,先预览待上传的图片 <body><input type="file"><img s ...

  7. 前端js实现图片上传

    前端js实现图片上传的原理是通过input标签的type=file属性将input标签定义为上传文件,对input进行onchange事件的监听,当input的value值改变时代表用户已经上传了图片 ...

  8. 手机端移动端的前端原生js裁剪图片上传

    手机端移动端的前端原生js裁剪图片上传 选择头像时裁剪上传,确保图片是个正方形,不会出现压扁拉伸的现象 效果图 原理很简单,其实就是用canvas截图出来而已,只是要对比例做一下处理. <!-- ...

  9. 关于editor网页编辑器ueditor.config.js 配置图片上传

    最近公司项目在做一个门户网站,其中新闻和简介等部分使用到了ueditor编辑器,但是上级明确指示需要图片上传这个功能,这时却发现图片上传功能不能正常使用,上传时一直报错,网上收了好几个处理办法,都说的 ...

最新文章

  1. MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)
  2. ProE常用曲线方程:Python Matplotlib 版本代码(玫瑰曲线)
  3. Makefile中几种赋值
  4. 使用 keytool 生成安卓应用程序签名
  5. Xcode中指令集相关选项
  6. foxmail地址簿怎么添加分组 foxmail地址簿新建分组的教程
  7. PHP出现 Notice: Undefined index:...的原因及解决办法
  8. 穷人变富的过程中,最大的阻碍是什么?
  9. matlab 点顺时针排序,怎样对平面中的点进行顺时针或者逆时针排序
  10. 注销公司是否需要办理注销呼叫中心许可证?
  11. 这5个优质动漫网站,能让你瞬间爆棚,都是满满的干货
  12. Java使用openOffice转PDF以及PDF文件预览乱码问题
  13. Android 手机设备信息获取使用详解
  14. 滤波笔记三:无迹卡尔曼滤波(UKF)
  15. docker如何查看宿主机到容器端口映射
  16. tf.keras.layers.BatchNormalization、tf.keras.layer.LayerNormalization函数
  17. 动手做个VR眼镜,找回童年的感觉
  18. 搭建linux服务器网络代理
  19. 空之轨迹激活显示服务器错误,空之轨迹OL黑屏闪退原因及解决方法一览
  20. 2022年化工自动化控制仪表最新解析及化工自动化控制仪表免费试题

热门文章

  1. python列表的基本操作-python列表的用法
  2. 并发导致java对象错乱
  3. mysql php 列转行_MySql行转列、列转行
  4. 机器视觉光源种类(环形光,条光,背光源,同轴光,线光,点光,穹顶光,开孔面光源等)
  5. 利用Serv-u提权的简单思路
  6. pytorch做seq2seq注意力模型的翻译
  7. Leetcode 1419:数青蛙(超详细的解法!!!)
  8. 微软实习提前批一面面经+Leader面面经
  9. substr, substing,slice
  10. ios怎么引入masonry_IOS Masonry的基本使用