NodeJs实战-Express构建照片存储网站(2)-上传、展示文件

news2024/12/22 14:51:54

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
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>图片上传</p>
    <form method="post" enctype="multipart/form-data" action="/photo/submit" >
      <p><input type="text" name="name", placeholder="Name" /></p>
      <p><input type="file" name="file" /></p>
      <p><input type="submit" value="Upload" /></p>
    </form>
  </body>
</html>

编写 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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业微信自建应用手动授权,获取用户详细信息

开始开发 最后更新&#xff1a;2022/10/11 企业微信提供了OAuth的授权登录方式&#xff0c;可以让从企业微信终端打开的网页获取成员的身份信息&#xff0c;从而免去登录的环节。 企业应用中的URL链接&#xff08;包括自定义菜单或者消息中的链接&#xff09;&#xff0c;均可…

宇视高空抛物相机配置指导

宇视高空抛物相机配置指导 登录摄像机网页界面&#xff0c;进入[配置>智能监控>智能功能]页面启用<高空抛物>功能&#xff0c;并进入高空抛物配置界面&#xff1b; 添加/删除检测规则&#xff0c;根据实际高空抛物场景和规则下发要求绘制检测区域&#xff1b; (…

必看!!!客户端requests与服务端request收发请求

当使用代码进行接口访问的时候&#xff0c;请求的发送与请求的接受使用的参数应该怎么如何传输能够请求到正确的响应呢? 一、使用GET请求发送&#xff0c;客户端与服务端的参数传输与接受。 1、服务端&#xff0c;首先使用web框架写一个简单的接口&#xff0c;接收两个参数&…

FineReport常用配置和方法

目录 1、隐藏参数面板的小箭头&#xff1a; 1、隐藏参数面板的小箭头&#xff1a; 查看小箭头的class&#xff0c;css设置如下属性&#xff1a; 隐藏按钮&#xff1a; // 旧版 $(.parameter-container-collapseimg-up).hide(); // 新版 $(.report-main-parameter-container-…

浙大MBA考研经验分享:名校梦不可负~

上大学的时候考研失败&#xff0c;对于没能进入浙大求学一直是我心里的遗憾&#xff01;但是毕业以来至今工作三年&#xff0c;职场上的经历让我意识到持续学习提升的重要性。一边工作一边备考&#xff0c;对于基础普通的我来说&#xff0c;一年备战能够以211分的成绩成功上岸浙…

Collection体系集合

一、Collection体系结构 Collection体系结构的根接口&#xff0c;代表一组对象&#xff0c;称为“集合”。 List接口的特点&#xff1a;有序、有下标、元素可重复。 Set 接口的特点&#xff1a;无序、无下标、元素不能重复。 二、Collection父接口 特点&#xff1a;代表一组…

分布式计算模型Mapreduce实践与原理剖析(一)

第一章 MapReduce核心理论 1.1 什么是MapReduce MapReduce 是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于 Hadoop 的数据应用” 的核心框架 。 MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并行运…

[短的文章] Spring Boot 日志创建使用、日志级别、@Slf4j、日志持久化——Spring Boot 系列

前言&#xff1a; 想必日志大家伙在项目开发调试过程中常会使用&#xff0c;这篇文章我们来一起探讨一下 Spring Boot 项目中日志的定义与使用&#xff0c;主要针对以下几个方面重点叙述 日志级别 日志框架进行日志定义 日志持久化 1 日志简述 1.1 为什么使用日志 日志大家在…

机器学习-逻辑回归

机器学习-基础知识 机器学习-线性回归 机器学习-逻辑回归 机器学习-聚类算法 机器学习-决策树算法 机器学习-集成算法 机器学习-SVM算法 文章目录逻辑回归1. 线性逻辑回归1.1. 理论基础1.2. 逻辑回归模拟步骤1.2.1. 数据集1.2.2. 模拟逻辑回归类模块1.2.3. 测试模块1.2.4. 数据…

PN532开发指南(uart)

开发环境 STM32F103C8T6 STM32f103c8t6最小系统板&#xff08;typec接口&#xff09; STM32CUBEMX PN532模块 一、NFC简介 NFC(Near Field Communication)近场通信&#xff0c;是一种短距高频的无线电技术&#xff0c;在13.56MHz频率运行于20厘米距离内。其传输速度有106Kb…

懒人福利:只需一行代码,导入所有的 Python 库

前言 今天给大家介绍一个懒人 Python 库—— Pyforest 。 使用一行代码&#xff0c;就能导入所有的 Python 库(本地已经安装的)。 GitHub 地址 https://github.com/8080labs/pyforest &#xff08;文末送读者福利&#xff09; / 01 / 介绍 Python 因为有着成千上万个功能…

paper 阅读: An introduction to ROC analysis

发布于2005年&#xff0c;附论文链接如下&#xff1a; https://ccrma.stanford.edu/workshops/mir2009/references/ROCintro.pdf 之前一直都是从各种博客上了解ROC的&#xff0c;最近才看到这一篇paper。 写在前面 用 True&#xff08;T&#xff09;和 False&#xff08;F&…

BGP进阶:BGP 基础实验配置

实验拓扑 实验需求 R1、R2、R3属于AS123&#xff0c;R4属于AS 400&#xff1b;AS123内的R1、R2、R3运行OSPF&#xff0c;通告各自直连接口&#xff0c;注意OSPF域的工作范围&#xff1b;R3-R4之间建立eBGP邻居关系&#xff0c;R2暂时不运行BGP&#xff0c;R1-R3之间建立iBGP邻…

MCE | D-萤光素 Protocol 在手,生物发光检测无忧!

■ Q: D-萤光素的作用原理 D-萤光素 (D-Luciferin) 是萤火虫萤光素酶 (Firefly Luciferase) 的化学发光底物。在ATP 和萤光素酶存在下&#xff0c;萤光素能够被氧化发光 (图 1)。当萤光素过量时&#xff0c;发光亮度与萤光素酶浓度呈正相关。通过萤光素/萤光素酶生物发光体系&…

小程序容器技术加快推动国产操作系统“上车”

计算机是当前乃至未来的基础工具&#xff0c;而负责管理计算机硬件与软件资源、提供必须的人机交互机制的操作系统无疑是整个计算机的核心系统软件。 可以说&#xff0c;操作系统是当前一个国家提升综合实力过程中必须要攻克、掌握的核心技术之一。 国产操作系统多为以Linux为…

猫狗肠道菌群—“主子们”的健康新领域

随着生活水平提升&#xff0c;我国养宠人士逐年增多。数据显示&#xff0c;我国城镇养宠人士达到6844万多人&#xff0c;且仍在不断增长。 其中养猫人群数占比59.5%&#xff0c;养狗人群数占比51.7%&#xff0c;养水族类占比8.3%&#xff0c;养爬行类宠物的占比为5.8%&#xff…

Linux 文件操作(三) —— 获取并打印某个文件的属性(文件类型、执行权限、文件大小)

目录 1、获取文件属性 stat / lstat / fstat (1) 参数 path (2) 参数 buf (3) 返回值 2、获取并打印某个文件的属性 (1) 获取文件类型 (2) 获取文件权限 (3) 获取文件大小 (4) 获取上一次的访问时间 (5) 最终代码 1、获取文件属性 stat / lstat / fstat stat / lsta…

[附源码]java毕业设计疫情防控期间网上教学管理

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

数据分析可视化之模型介绍

一 前言 “数据分析可视化”这条术语实现了成熟的科学可视化领域与较年轻的信息可视化领域的统一。 数据分析可视化&#xff1a;是指将大型数据集中的数据以图形图像形式表示&#xff0c;并利用数据分析和开发工具发现其中未知信息的处理过程。 数据可视化已经提出了许多方法&…

【软件工程导论】1.软件过程模型

软件过程模型什么是软件过程模型包括瀑布模型特点演化模型特点增量模型特点原型模型类型使用策略废弃策略追加策略螺旋模型特点什么是软件过程模型 又叫作软件开发模型、软件生存周期模型 包括 瀑布模型 每一阶段都会生成文档 特点 缺乏灵活性在交互使用时才能发现问题&…