[node文件的上传和下载]一.node实现文件上传;二、Express实现文件下载;三、遍历下载文件夹下的文件,拼接成一个下载的url,传递到前端

news2024/10/5 15:31:23

目录

 

一.node实现文件上传

1.FormData对象:以对象的方式来表示页面中的表单,又称为表单对象。以key:value的方式来保存数据,XMLHttpRequest对象可以轻松的将表单对象发送到服务器端

(1)是一个构造函数:new FormData(),例如:

(2)常用的API:

2.node使用formidable模块实现文件上传

(1)安装:npm install formidable

(2)创建Formidable.IncomingForm对象:本质是一个表单对象

(3)Formidable.IncomingForm对象的属性:

(4)Formidable.IncomingForm对象的方法:

(5)Formidable.File对象的属性:

3.示例:

4、文件上传需要注意的问题

(1)前端FormData对象作用:用于保存上传文件的信息。格式:key-value

(2)后台formidable模块的作用:使用parse方法来解析前端的formdata对象

(3)上传过程中前后端的对应关系 

二、Express实现文件下载

1、使用res对象(响应对象)的download方法即可

三、遍历下载文件夹下的文件,拼接成一个下载的url,传递到前端


 

一.node实现文件上传

1.FormData对象:以对象的方式来表示页面中的表单,又称为表单对象。以key:value的方式来保存数据,XMLHttpRequest对象可以轻松的将表单对象发送到服务器端

(1)是一个构造函数:new FormData(),例如:

var formdata = new FormData(form)  //将页面中的表单form转换成FormData对象(即将表单数据转换成key:value)

(2)常用的API:

        FormData.append(key,value):追加数据。向formdata中追加key:value

        FormData.get(key):获取key对应的第一个值

        FormData.getAll(key):获取key对应的所有值

        FormData.delete(key):删除key对应的值

        FormData.has(key):判断formdata是否有key,若有则返回true,否则false

2.node使用formidable模块实现文件上传

(1)安装:npm install formidable

(2)创建Formidable.IncomingForm对象:本质是一个表单对象

                let form = new Formidable.IncomingForm()

(3)Formidable.IncomingForm对象的属性:

                form.encoding:设置字符集

                form.uploadDir:上传文件的保存路径

                form.keepExtensions:若为true,则表示上传时保留原来的扩展名

(4)Formidable.IncomingForm对象的方法:

                form.parse(request,[callback]):转换请求中的表单数据

(5)Formidable.File对象的属性:

                size:上传文件的大小

                path:上传文件的路径

                type:上传文件的类型

                name:上传的文件名

3.示例:

前端代码:

form.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/jquery-3.4.1.js"></script>
</head>
<body>
    <!-- 上传图片:
        (1)将图片文件上传到服务器的指定目录
        (2)将图片文件名和服务器的地址进行拼接
        (3)将拼接后的图片的路径响应给客户端,在div中显示出来
     -->
    <label for="">
        请选择文件:
        <input type="file" id="file">
    </label>
    <br><br>
    <div id="box"></div>
    <script>
        $(function(){
            // 创建formdata对象
            let formdata = new FormData()
            // 给file控件绑定change事件
            $('#file').change(function(){
                // 1.获取input中得到的文件名
                if ($('#file').val().length) {  //如果用户选择了文件
                    // 获取文件名
                    let fileName = $('#file').val()
                    // 获取文件的后缀---扩展名,并将其转换成小写
                    let extenName = fileName.substring(fileName.lastIndexOf('.'),fileName.length).toLowerCase()
                    // 判断文件类型
                    if (extenName === '.jpg' || extenName === '.png') {
                        // 追加
                        formdata.append('uploadFile',$('#file')[0].files[0])
                    }else{
                        alert('文件格式不正确')
                    }
                }
                // 2.向服务器发起上传请求
                $.ajax({
                    url:'http://127.0.0.1:8888/updown/upload',
                    type:'post',
                    data:formdata,
                    cache:false,    //上传时文件不缓存
                    contentType:false,  //jQuery不能设置请求头中的contentType,必须的设置
                    processData:false,  //jQuery不能处理上传的数据,必须配置
                    success:function(result){
                        //2.1创建一个img标签
                        let img = document.createElement('img')
                        //2.2设置img标签的样式
                        img.style.width = 350 + 'px'
                        img.style.height = 350 + 'px'
                        //2.3设置标签的src属性
                        img.src = result.path   //path:表示服务器响应图片的路径
                        //2.4显示的设置
                        $('img').remove() //有新图片显示时,将原图片删除
                        //2.5将img标签添加到div中
                        $('#box').append(img)
                    },
                    error:function(error){  //请求-响应失败后的处理代码
                        console.log(error)
                    }
                })
            })
        })
    </script>
</body>
</html>

后台(上传-下载服务器)

routes文件----》updown文件-->updownservice.js

上传

const express = require('express')
const router = express.Router()
//导入
const fs = require('fs')

//
const formidable = require('formidable')

//
const path = require('path')

//上传 http://127.0.0.1:8888/updown/upload
router.post('/upload', (req, res) => {
    //1.设置上传文件的保存路径:上传文件夹
    let cacheFolder = 'public/images/uploads'
    //2.判断上传文件夹是否存在,若不存在则创建
    if (!fs.existsSync(cacheFolder)) {   //同步判断
        fs.mkdirSync(cacheFolder)   //同步创建
    }
    // res.json({code:2000})
    //3.创建form对象接收客户端的formdata中的数据:使用formidable模块的IncomingForm
    let form = new formidable.IncomingForm()
    form.encoding = 'utf-8'     //设置表单域的字符集
    form.uploadDir = cacheFolder    //设置上传目录
    form.keepExtensions = true  //保留上传文件的后缀
    form.maxFieldsSize = 2 * 1024 * 1024    //2M
    form.type = true    //上传文件的类型为只读
    //4.接收上传文件并进行处理
    let displayUrl  //上传的文件在服务器端的访问路径
    form.parse(req, function (err, fields, files) {
        if (err) {   //表示上传错误
            res.send(err)
            return
        }
        let extName = ''    //存放上传文件的后缀(扩展名)
        switch (files.uploadFile.mimetype) {    //uploadFile对应的是前端formdata中的key;mimetype表示上传文件的类
            case 'image/jpg':
                extName = '.jpg';
                break;
            case 'image/jpeg':
                extName = '.jpg';
                break;
            case 'image/png':
                extName = '.png';
                break;
        }
        //5.对上传文件的后缀进行处理
        if (extName.length == 0) {
            res.send({
                code: 202,
                msg: '只能上传jpg和png格式的文件'
            })
        } else { //符合上传要求的文件
            //5.1将上传文件夹和上传的文件名进行拼接
            let savePath = form.uploadDir + '/' + files.uploadFile.originalFilename  //originalFilename表示上传文件的原名
            displayUrl = `http://127.0.0.1:8888/images/uploads/${files.uploadFile.originalFilename}`
            //5.2对文件重命名
            fs.renameSync(files.uploadFile.filepath, savePath)   //用savePath替换filePath,方法必须是同步方法
            res.json({
                code: 202,
                path: displayUrl
            })

        }
    })

})

//download      http://127.0.0.1:8888/updown/download
router.get('/download', (req, res) => {
    try {
        //使用path模块对客户端请求下载的文件路径进行拼接
        //__dirname:全局属性,代表的是当前文件的绝对路径
        let filePath = path.join(__dirname,'../../public/images/uploads/' + req.query.fileName)
        console.log(__dirname)
        res.download(filePath)
    } catch (e) {
        console.log(e)
    }
})



4、文件上传需要注意的问题

(1)前端FormData对象作用:用于保存上传文件的信息。格式:key-value

(2)后台formidable模块的作用:使用parse方法来解析前端的formdata对象

(3)上传过程中前后端的对应关系 

二、Express实现文件下载

1、使用res对象(响应对象)的download方法即可

三、遍历下载文件夹下的文件,拼接成一个下载的url,传递到前端

后台接口:

routes文件----》updawn文件-->updownservice.js

下载

//遍历下载文件夹的接口    http://127.0.0.1:8888/updown/getfiles
router.get('/getfiles',(req, res)=>{
    //1.遍历下载文件夹:public/images/uploads
    let filePath = path.join(__dirname,'../../public/images/uploads/')  //下载文件夹
    let url_arr = []    //存放下载的url
    fs.readdir(filePath,(err, files)=>{ //files参数中存放的是filePath下的子目录名和文件名
        if (err){
            console.log(err)
        }else {
            for (let i=0 ; i<files.length;i++){
                let fileDir = path.join(filePath,files[i])
                if (fs.statSync(fileDir).isFile()){     //表示当前的files[i]是一个文件
                    let urlObj = {
                        fileName:files[i],  //文件名
                        downloadUrl:`http://127.0.0.1:8888/updown/download?fileName=${files[i]}`
                    }
                    url_arr.push(urlObj)    //把要下载的文件路径、文件放入数组中
                }
            }
            res.json(url_arr)
        }
    })
})
module.exports = router

前端页面:

download.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/jquery-3.4.1.js"></script>
</head>
<body>
    <div id="box"></div>
    <script>
        $(function(){
            $.ajax({
                url:'http://127.0.0.1:8888/updown/getfiles',
                type:'get',
                dataType:'json',
                success:function(result){
                    for (const data of result) {
                        $('#box').append(`<a href=${data.downloadUrl}>下载${data.fileName}</a>`)
                                .append('<br><br>')
                    }
                }
            })
        })
    </script>
</body>
</html>

 

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

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

相关文章

LabVIEW在应用程序和接口中使用LabVIEW类和接口

LabVIEW在应用程序和接口中使用LabVIEW类和接口 LabVIEW类和接口是用户定义的数据类型。LabVIEW类和接口开发人员创建并发布这些数据类型。LabVIEW类或接口用户无需了解如何创建LabVIEW类或接口&#xff0c;但必须了解应用程序中通过类或接口定义的数据类型应当如何使用&#…

通过java代码实现对json字符串的格式美化(完整版)

一、前言 之前转载过一篇文章&#xff0c;也是有关于通过java代码实现对json字符串的格式美化&#xff0c;但是那篇文章的实现还不够完善&#xff0c;比如其对字符串中出现特殊字符时&#xff0c;会出现转换失败。因此博主本人也是闲暇时在那份代码的基础上做了完善和补充。好…

[附源码]计算机毕业设计校园租赁系统Springboot程序

项目运行 环境配置&#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…

Tomcat服务器的简介以及安装

文章目录1.概念1.1 什么是Web服务器&#xff1f;1.2 静态资源和动态资源1.3 常用服务器产品2. Tomcat的安装2.1 下载2.2 解压安装2.3 Tomcat的目录结构2.4 Tomcat服务器的启动和关闭2.5 tomcat启动失败的原因2.5.1 查看报错原因2.5.2 错误原因2.5.2.1 查看JAVA_HOME配置是正确2…

ESP32——WEB服务程序移植(基于示例restful_server)

一、简介 将ESP32——WEB服务程序测试项目移植到一个现有项目中&#xff0c;现有项目包括基于固定IP的WIFI连接、OTA升级、Websocket等功能。 二、移植 2.1 参考restful_server项目下分区表文件partitions_example.csv修改项目分区 因模块采用ESP32-WROVER-E(4MB)&#xff…

磨金石教育摄影技能干货分享|乡愁摄影作品欣赏——传统建筑篇

俗话说“一方水土养一方人”&#xff0c;不同的山川地域与气候环境早就不同的地域文化。我国幅员广阔&#xff0c;南北东西跨度极大&#xff0c;因此气候环境与地理环境差异很大。在民俗文化上面也呈现出多元化风格。 这种多元化的文化风格清晰的体现在各地的建筑形式上。重庆的…

Java【String】【StringBuilder】【StringBuffer】你都会用吗

文章目录前言一、常用的方法1、字符串构造2、字符串比较3、字符串查找4、字符串转化5、字符串替换6、字符串分割7、字符串截取二、字符串的不可变性三、StringBuilder、StringBuffer总结前言 在校招和笔试过程中&#xff0c;字符串是相当频繁被问到的话题&#xff0c;在之前的…

iMazing兼容Win和Mac2023免费版iOS设备管理器

iMazing是一款ios设备管理软件&#xff0c;该软件支持对基于iOS系统的设备进行数据传输与备份&#xff0c;用户可以将包括&#xff1a;照片、音乐、铃声、视频、电子书及通讯录等在内的众多信息在Windows/Mac电脑中传输/备份/管理。 软件备份是指将一部手机上的重要信息和资料&…

Pytorch -> ONNX -> TensorRT 模型转换与部署

系统环境&#xff1a; Ubuntu 18.04Cuda 11.3Cudnn 8.4.1 1 、Pytorch -> ONNX 网上相关流程很多&#xff0c;我就不重复了 可以参考Pytorch分类模型转onnx以及onnx模型推理 或者直接看Pytorch官方怎么干的。 ONNX Github onnxruntime调用onnx模型推理时有一个provider…

HTML5期末大作业:基于HTML+CSS+JavaScript茶文化中国水墨风格绿色茶叶销售(5页) 学生网页设计作业源码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

用coding向你最爱的人说圣诞快乐

&#x1f384;&#x1f384;&#x1f384;圣诞节即将到来&#xff0c;今天让我们用编码的方式向你最爱的人表达圣诞节快乐。 圣诞节的起源 圣诞节源自古罗马人迎接新年的农神节&#xff0c;与基督教本无关系。在基督教盛行罗马帝国后&#xff0c;教廷将这种民俗节日纳入基督教体…

DenseNet的基本思想

之前的文章介绍过残差网络的基本思想&#xff1a;残差网络的思想就是将网络学习的映射从X到Y转为学习从X到Y-X的差&#xff0c;然后把学习到的残差信息加到原来的输出上即可。即便在某些极端情况下&#xff0c;这个残差为0&#xff0c;那么网络就是一个X到Y的恒等映射。其示意图…

Java基础类型和运算符

文章目录变量与常量变量的命名规则常量final 关键字修饰的常量字面常量基本类型整型基本整型变量 int长整型 long短整型 short比特型 byte浮点数 float和double关于3*0.10.3三种特殊的double字符型 char布尔类型 boolean类型转换隐式类型提升强制类型转换运算符算数运算符基本四…

vue中打印插件vue-print-nb(二)-实例之两种方法——安包之设置一个id和绑定一个对象 下载print.js之ref设置锚点

vue中打印插件vue-print-nb(二)-实例之两种方法——安包之设置一个id和绑定一个对象 & 下载print.js之ref设置锚点 第一种方法 方式1、设置一个id ① 给要打印的部分设置一个 id ② 在打印按钮中添加 v-print"#id名" 1、安装vue-print-nb插件 npm install v…

Firefly RK3399 PC pro Android 10下载验证

一.Android 源码以及image 1.Android 10代码链接&#xff1a; 百度网盘 请输入提取码 密码&#xff1a;1234 下载后检查md5值&#xff0c;检查下载是否正确&#xff1a; fb41fcdc48b1cf90ecac4a5bb8fafc7a Firefly-RK3399_Android10.0_git_20211222.7z.001 82d665fb54fb412…

Flutter ー Authentication 认证

Flutter ー Authentication 认证 原文 https://medium.com/simbu/flutter-authentication-adb8df7cf673 前言 如果我相信我知道你是谁那我就能让你查看你的个人 应用 application 资料。 身份验证可能是应用程序必须处理的最大的交叉问题。 将它作为一个特性添加到 DigestableP…

HashMap JDK1.7与1.8的区别

结构 首先HashMap在1.7中是以数组链表的形式存在的, 而HashMap在1.8中则是以数组链表红黑树构成的, 当一个节点的链表长度超过8并且数组长度超过64时会将链表转换为红黑树, 初始化 初始容量大小介绍 说到数组就不得不提HashMap里面的成员变量DEFAULT_INITIAL_CAPACITY也就是…

Mysql进阶学习(八)DDL语言+数据类型和DTL语言

Mysql进阶学习&#xff08;八&#xff09;DDL语言与DTL语言DDL语言1、简介&#xff1a;1.1、库的管理1.1.1、库的创建1.1.2、库的修改1.1.3、库的删除1.2、表的管理1.2.1.表的创建 ★1.2.2.表的修改1.2.3.表的删除1.2.4.表的复制测试案例1. 创建表dept12. 将表departments中的数…

SpringBoot_整合Thymeleaff模板引擎

Thymeleaf模板引擎的主要目标是将优雅的自然模板带到开发工作流程中&#xff0c;并将HTML在浏览器中正确显示&#xff0c;并且可以作为静态原型&#xff0c;让开发团队能更容易地协作。Thymeleaf能够处理HTML&#xff0c;XML&#xff0c;JavaScript&#xff0c;CSS甚至纯文本。…

Qt扫盲-Qt Designer 设计师使用总结

Designer 设计师使用总结一、顶部菜单栏1. 常用的菜单内容2. 快捷工具栏说明二、左侧控件栏1. 组件分类2. 筛选三、中间绘图区1. 左侧控件区拖放控件到中间2. 中间区域布局3. 属性修改四、右侧属性栏1. 对象查看器2. 属性编辑器3.组织结构2. 属性设置五、美化专栏1.单个设置层叠…