node接收文件

2023-11-10

目录

html

nodejs详细实现

nodejs简单实现


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>index</title>
    <script type="text/javascript" src="base64.js"></script>
  </head>
  <body>
    <input type="file" id="file" multiple accept=".dwg" />

    <button onclick="btnClick()">上传</button>

    <button onclick="lookBtnClick()">查看</button>

    <!-- 表单的同步提交及缺点
        什么是表单的同步提交
        通过点击 submit 按钮,触发表单提交的操作,从而使页面跳转到 action URL 的行为,叫做表单的同步提交
        表单同步提交的缺点
        <form> 表单同步提交后,整个页面会发生跳转,跳转到 action URL 所指向的地址,用户体验很差
        <form> 表单同步提交后,页面之前的状态和数据会丢失 -->

    <!-- 阻止表单默认提交行为
        当监听到表单的提交事件以后,可以调用事件对象的 event.preventDefault() 函数,来阻止表单的提交和页面的跳转 -->

    <!-- 文件名为:file1 后端接收到的对象名就是 file1:{} 对象 -->
    <form action="http://localhost:3000/upload" method="POST" enctype="multipart/form-data">
      <input multiple type="file" name="file1" />
      <input type="submit" value="提交" />
    </form>

    <script>
      var url = ''
      var file = document.getElementById('file')

      var files1 = ''

      file.onchange = function () {
        files1 = this.files[0]
        console.log(this.files)
      }

      function btnClick() {
        let formData = new FormData()
        console.log(files1)
        formData.append('file1', files1)
        let xhr = new XMLHttpRequest()
        xhr.open('post', 'http://127.0.0.1:3002/upload_file', true)
        // xhr.setRequestHeader('content-type' , 'application/x-www-form-urlencoded');
        xhr.send(formData)
        xhr.onreadystatechange = () => {
          //   console.log(xhr.response)
          console.log(JSON.parse(xhr.response))
          url = JSON.parse(xhr.response).filePath
          console.log(url)
        }
      }

      function lookBtnClick() {
        // var url = 'http://127.0.0.1:8080/file/a-2.dwg' //要预览文件的访问地址
        window.open('http://127.0.0.1:8012/onlinePreview?url=' + encodeURIComponent(Base64.encode(url)) + '&officePreviewType=pdf')
      }
    </script>
  </body>
</html>

nodejs详细实现

const formidable = require('formidable')
const url = require('url')
const express = require('express')
const bodyParser = require('body-parser')
const path = require('path')
const fs = require('fs')
// const multer = require('multer');

const app = express()
// app.use(multer().any());//上传任何文件

app.use(express.static(__dirname + '/www'))
// 开放目录
app.use('/file/', express.static(__dirname + '/file/'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

// 跨域
app.all('*', function (req, res, next) {
  //设置允许跨域的域名,*代表允许任意域名跨域
  res.header('Access-Control-Allow-Origin', '*')
  //允许的header类型
  res.header('Access-Control-Allow-Headers', 'Origin,X-Requested-With,Accept,Content-type')
  res.header('Access-Control-Allow-Credentials', true)
  //跨域允许的请求方式
  res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')
  res.header('Content-Type', 'application/json;charset=utf-8')
  if (req.method.toLowerCase() == 'options') res.sendStatus(200) //让options尝试请求快速结束
  else next()
})

app.post('/', (req, res) => {
  console.log(req.body, 'body')
  console.log(url.parse(req.url))
  res.send({ status: 200, string: 'hello word!', code: 1 })
})

app.post('/upload', (req, res) => {
  // console.log(req.files)
  // 创建formidable表单解析对象
  const form = new formidable.IncomingForm()
  // 保留上传文件的后缀名字
  form.keepExtensions = true
  // 设置上传文件的保存路径
  form.uploadDir = path.join(__dirname, 'file')

  // 解析客户端传递过来的formData对象
  form.parse(req, (err, fields, files) => {
    // req:请求对象
    // err:错误对象
    // filelds:普通请求参数的内容
    // files:文件的内容的参数包括保存的地址信息
    console.log(files)
    // 需要更改名字,让文件可以正常打开
    var oldpath = files.file1.filepath
    let newpath = 'file/' + files.file1.originalFilename
    // var newpath = path.parse(files.file.name).name + sd.format(new Date(), 'YYYYMMDDHHmmss') + path.parse(files.file.name).ext
    console.log(files.file1.filepath)
    // 保存文件
    fs.rename(oldpath, newpath, function (err) {
      if (err) console.log('改名失败', err)
    })
    res.send({ filePath: 'http://127.0.0.1:3000/' + newpath })
  })
})

app.listen(3000, () => {
  console.log('server start 3000')
})

nodejs简单实现

let fs = require('fs')
let path = require('path')
let express = require('express')
let formidable = require('formidable')

const app = express()

// 开放目录
app.use('/file/', express.static(__dirname + '/file/'))

// 跨域
app.all('*', function (req, res, next) {
  //设置允许跨域的域名,*代表允许任意域名跨域
  res.header('Access-Control-Allow-Origin', '*')
  //允许的header类型
  res.header('Access-Control-Allow-Headers', 'Origin,X-Requested-With,Accept,Content-type')
  res.header('Access-Control-Allow-Credentials', true)
  //跨域允许的请求方式
  res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')
  res.header('Content-Type', 'application/json;charset=utf-8')
  if (req.method.toLowerCase() == 'options') res.sendStatus(200) //让options尝试请求快速结束
  else next()
})

// 保存文件
function saveFile(file, callback) {
  // 定义存储文件地址
  let savePath = path.resolve(__dirname, `./file/${file.file1.originalFilename}`)
  let sourcePath = file.file1.filepath

  // 创建读写流
  let readStream = fs.createReadStream(sourcePath)
  let writeStream = fs.createWriteStream(savePath)

  // 读写进程开始
  readStream.pipe(writeStream)

  // 监听读取完成事件
  readStream.on('end', () => {
    // 读取完成后,释放读取源文件链接
    fs.unlinkSync(sourcePath)
    callback('http://127.0.0.1:3002/file/' + file.file1.originalFilename)
  })
}

// 上传文件接口
app.post('/upload_file', (req, res) => {
  let form = new formidable.IncomingForm()
  form.parse(req, function (err, fields, files) {
    // 对于单个文件,这里的files直接是file对象
    let file = files
    console.log(file)
    saveFile(file, (data) => {
      res.send({ state: 'success', msg: '上传成功!', filePath: data })
    })
  })
})

// 启动
app.listen(3002, () => {
  console.log('start server 3002')
})

参考:如何使用nodejs接收上传文件 | 码农家园

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

node接收文件 的相关文章

随机推荐

  • Java中Thread类run(),start()区别

    转自 Java中Thread类run start 区别 下文讲述Thread类中run start 方法的不同之处说明 如下所示 run start 方法功能的区别 1 start 方法用于启动线程 run方法只是Thread子类的一个普通
  • mysql数据库迁移到瀚高数据库,包含数据迁移、sql语法、服务启动、部署、tomcat问题整理

    文章目录 1 数据库迁移 2 数据库设置主键自增 2 1 数据库字段问题 2 2 存在即更新 2 3 清空数据表 2 4 瀚高数据库查询过程中显示转换 2 5 mybatis插入一条数据返回自增的主键值 2 6 瀚高数据库服务无法启动 3
  • 《数值分析》-- 雅可比迭代法、高斯—塞德尔迭代法

    文章目录 一 基本迭代法的格式及收敛性 1 1 迭代法思想 1 2 向量序列收敛的定义 二 迭代法的收敛与发散 三 雅可比迭代法和高斯赛德尔迭代法 3 1 雅可比迭代法 3 2 高斯 赛得尔 Gauss Seidel 迭代法 四 迭代法的收
  • python无法安装第三方库read time out_(python pip安装第三方库超时问题(raise ReadTimeoutErrorself._pool, None, 'Read time...

    python pip安装第三方库超时问题 raise ReadTimeoutErrorself pool None Read timed out pip工具安装 百度经验链接 pip安装及环境变量配置 pip下载超时处理 aise Read
  • Apache Shiro 简介

    本文转载自 点击打开链接 1 1 简介 Apache Shiro是Java的一个安全框架 目前 使用Apache Shiro的人越来越多 因为它相当简单 对比Spring Security 可能没有Spring Security做的功能强大
  • ztree 修改样式_zTree样式修改

    ztree挺好用的 不过公司美工设计的行政树图稿一般都比ztree原生的样式要好看的多 所以只能自己单独对样式进行修改 目前样式倒是修改好了 只能不能根据层级动态匹配样式 每个层级的被选中样式需要对两个属性单独设置 具体修改地方下面代码中有
  • java里%是什么_java里"."是什么意思?

    展开全部 lt 数学意义 在数字没有溢出的前提下 对于正数和负数 左移一位都相当于乘以2的1次方 左移n位就相当于乘以2的n次方 计算 3 lt lt 2 3 lt lt 2 则是将数字3左移2位 1 首先把3转换为二进制数字0000 00
  • python机器学习手写算法系列——逻辑回归

    从机器学习到逻辑回归 今天 我们只关注机器学习到线性回归这条线上的概念 别的以后再说 为了让大家听懂 我这次也不查维基百科了 直接按照自己的理解用大白话说 可能不是很严谨 机器学习就是机器可以自己学习 而机器学习的方法就是利用现有的数据和算
  • SQL11 高级操作符练习(1)

    描述 题目 现在运营想要找到男性且GPA在3 5以上 不包括3 5 的用户进行调研 请你取出相关数据 示例 user profile id device id gender age university gpa 1 2138 male 21
  • 牛客SQL练习一

    1 题目描述 查找最晚入职员工的所有信息 CREATE TABLE employees emp no int 11 NOT NULL birth date date NOT NULL first name varchar 14 NOT NU
  • springboot自定义favicon.ico

    先上效果图 1 在application yml文件中必须修改配置 spring mvc favicon enabled false spring mvc favicon enabled false 2 在static文件下 ico转化地址
  • LeetCode-Python-1248. 统计「优美子数组」(数组 + 数学)

    给你一个整数数组 nums 和一个整数 k 如果某个子数组中恰好有 k 个奇数数字 我们就认为这个子数组是 优美子数组 请返回这个数组中 优美子数组 的数目 示例 1 输入 nums 1 1 2 1 1 k 3 输出 2 解释 包含 3 个
  • base64格式图片展示

    后端发图片 为base64格式的 前端接收后页面展示图片 处理方法 let imageData data image png base64 res data image 后端传来数据 如果base64位图片没有带前面得头 data imag
  • clickhouse索引原理介绍

    clickhouse本身支持很多表引擎 这里只介绍其中最常用的MergeTree引擎 建表语句 name1 type1 DEFAULT MATERIALIZED ALIAS expr1 TTL expr1 name2 type2 DEFAU
  • cannot import name ‘Merge‘ from ‘keras.layers‘解决方法

    首先根据报错提示 找到对应的文件 看看Merge是否在keras layers里 发现现在已经改成下图的了 直接复制粘贴到代码里即可 报错提示为王 别再扎错方向
  • 数据清洗的基本流程_数据分析几步走?告诉你全面系统的流程

    通过对 谁说菜鸟不会数据分析 的阅读 我们知道数据分析的一般流程为 明确分析目标 一切以目标为导向 确定分析思路 数据获取 数据处理 清洗 转化 提取 计算等 数据分析及可视化 报表撰写 这就是数据分析的一般流程 本章我们就讲一下各个流程中
  • MySQl数据库必会sql语句(提升版)

    原文链接 http blog csdn net qq 32059827 article details 51778816 这一篇属于加强版 问题和sql语句如下 创建users表 设置id name gender sal字段 其中id为主键
  • 5V转1.8V稳压芯片,3.7V转1.8V稳压芯片

    5V转1 8V稳压芯片 3 7V转1 8V稳压芯片 5V转1 8V芯片 3 7V转1 8V芯片 5V转1 8V降压芯片 3 7V转1 8V降压芯片 5V转1 8V电路图 3 7V转1 8V电路图 锂电池3 7V输入和供电5V输入 降压转换成
  • 没有调试适配器,无法发送“variables”

    vs code调试报 没有调试适配器 无法发送 variables 今天在vs code调试node区块链应用时 点开打印内容 提示如上 并看不到打印内容 原因及解决方法 出现在这种情况是因为node调试比较特殊 执行调试完成之后进程退出
  • node接收文件

    目录 html nodejs详细实现 nodejs简单实现 html