NodeJs实战-Express构建照片存储网站(2)-上传、展示文件
创始人
2024-02-12 08:46:12
0

Express构建照片存储网站2-上传、展示文件

  • 静态资源显示图片
  • photo页面展示文件夹下的图片
  • 上传文件
    • 增加上传页面的路由
    • 增加提交接口的路由
  • 网站效果图
  • 项目地址

上一节使用的静态数据存储的图片的数据,本节增加如下功能
1–上传文件
2–展示文件
在这里插入图片描述

静态资源显示图片

app.js 中有指定了静态资源文件的路径

app.use(express.static(path.join(__dirname, 'public')));

有这一行的设置,可以访问 public 文件夹下面的静态资源
在这里插入图片描述
工程目录下面 public/images 下面有若干图片,启动服务之后,访问对应的地址就可以展示图片,比如图片的名字为 1669269355053_1.png,浏览器访问

http://127.0.0.1:3000/images/1669269355053_1.png

在这里插入图片描述

photo页面展示文件夹下的图片

修改 routes 文件下的 photo.js

var express = require('express');
var router = express.Router();
var multiparty = require('multiparty');
var fs = require('fs');
var destpath = "./public/images/";
var urlpath = "/images/";// photos.push({
//   'name': 'photo1',
//   'path': '/images/abd3c3ec-922c-11e7-8a20-0242ac11000c.png'
// });
// photos.push({
//   'name': 'photo2',
//   'path': '/images/6db31128-39dd-11e7-895e-0242ac110016.png'
// });/* GET photo page. */
router.get('/', function (req, res, next) {let arr = fs.readdir(destpath, function(err, files) {if (err) {console.log('读取文件夹错误:', err);} else {var photos = [];files.forEach(fileName => {let item = {'name':'','path':''};item.name = findFileName(fileName);item.path = urlpath + fileName;photos.push(item);});res.render('photos', { title: 'Photos', data: photos });}});
});function findFileType(originalFilename) {var lastIndex = originalFilename.lastIndexOf('.');if (lastIndex != -1) {return originalFilename.substring(lastIndex);}return originalFilename;
}function findFileName(inputFileName) {var lastIndex = inputFileName.lastIndexOf('.');if (lastIndex != -1) {return inputFileName.substring(0, lastIndex);}return inputFileName;
}module.exports = router;

展示文件夹下的所有图片

router.get('/', function (req, res, next) {let arr = fs.readdir(destpath, function(err, files) {if (err) {console.log('读取文件夹错误:', err);} else {var photos = [];files.forEach(fileName => {let item = {'name':'','path':''};item.name = findFileName(fileName);item.path = urlpath + fileName;photos.push(item);});res.render('photos', { title: 'Photos', data: photos });}});
});
  1. 使用 fs 模块读取指定文件夹下面的所有文件
  2. 将图片名字拼接静态资源的前缀 /images/,作为 img 标签的 src 数据
  3. 将数据输出到 views/photos/index.ejs 视图
res.render('photos', { title: 'Photos', data: photos });

启动服务,访问

http://127.0.0.1:3000/photo

展示了 images 文件夹下面的所有图片
在这里插入图片描述

上传文件

增加上传页面的路由

  1. 修改 photo.js, 增加如下代码
router.get('/upload', function (req, res, next) {res.render('photos/upload', { title: '图片上传' });
});
  1. 增加路由对应的页面 upload.ejs

<%= title %>

<%= title %>

图片上传

编写 form 表单上传文件,需要指定 form 表单的 enctype 属性为 multipart/form-data,当点击提交的时候会调用后台的 /photo/submit接口
在这里插入图片描述

增加提交接口的路由

修改 photo.js

  1. 先引入 multiparty 模块用于解析表单
var multiparty = require('multiparty');
  1. 增加 /submit 路由
router.post('/submit', function (req, res, next) {var form = new multiparty.Form();form.encoding = 'utf-8';form.uploadDir = destpath;form.maxFilesSize = 20 * 1024 * 1024;form.parse(req, (err, fields, files) => {if (err) {console.log('解析上传文件错误:', err);} else {var originalFilename = files.file[0].originalFilename;var fileType = findFileType(originalFilename);var fileName = originalFilename;if (fields.name != null) {fileName = fields.name[0] + fileType;}var uploadedPath = files.file[0].path;var newFileName = destpath + new Date().getTime() + "_" + fileName;fs.rename(uploadedPath, newFileName, (err) => {if (err) {console.log('重命名文件错误:', err);throw err;}res.redirect('/photo');});}});});

第一步:解析 form 表单

 var form = new multiparty.Form();form.encoding = 'utf-8';form.uploadDir = destpath;form.maxFilesSize = 20 * 1024 * 1024;form.parse(req, (err, fields, files) => {}));

第二步:重命名文件,用表单接收的name重命名

 fs.rename(uploadedPath, newFileName, (err) => {});

第三步:重定向到图片展示页面

 res.redirect('/photo');

网站效果图

  1. 启动服务
F:\Github\Nodejs\photo>npm start> photo@0.0.0 start
> node ./bin/www
  1. 浏览器访问
http://127.0.0.1:3000/photo

在这里插入图片描述
3. 点击上传,跳转到表单上传页面
在这里插入图片描述
4. 填写完表单,点击upload,重定向到首页
在这里插入图片描述

项目地址

https://gitee.com/3281328128/photo/tree/master/

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...