node接收文件

目录

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详细实现

安装:npm i formidable@2.1.1

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简单实现

安装:npm i formidable@2.1.1

let fs = require('fs')
let path = require('path')
let express = require('express')
let formidable = require('formidable')
let form = new formidable.IncomingForm()
form.options.maxFileSize = 500 * 1024 * 1024 // 设置最大上传为500MB

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) => {
  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接收上传文件 | 码农家园

要在Node.js中使用Mongoose接受上传文件,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了`multer`,这是一个Node.js中用于处理文件上传的中间件。你可以使用以下命令安装它: ```bash npm install multer ``` 2. 在你的Node.js应用程序中引入`multer`和`mongoose`模块: ```javascript const multer = require('multer');const mongoose = require('mongoose'); ``` 3. 创建一个用于保存上传文件的存储引擎。你可以使用`multer.diskStorage`创建一个将文件保存在磁盘上的存储引擎。在这个例子中,我们将文件保存在名为`uploads`的文件夹中: ```javascript const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads/'); }, filename: function (req, file, cb) { cb(null, file.originalname); } }); ``` 4. 创建一个`multer`实例,并将存储引擎传递给它: ```javascript const upload = multer({ storage: storage }); ``` 5. 创建一个Mongoose模型,用于表示上传的文件。你可以定义一个包含文件相关信息的模式,例如文件名、路径等: ```javascript const fileSchema = new mongoose.Schema({ filename: String, path: String, }); const File = mongoose.model('File', fileSchema); ``` 6. 在路由处理程序中使用`upload`中间件来处理文件上传。你可以在适当的路由处理程序中使用`upload.single`、`upload.array`或`upload.fields`来处理单个文件、多个文件或带有不同字段名的文件: ```javascript app.post('/upload', upload.single('file'), async (req, res) => { try { // 创建一个新的文件实例 const newFile = new File({ filename: req.file.originalname, path: req.file.path }); // 将文件保存到数据库 await newFile.save(); res.status(200).json({ message: '文件上传成功' }); } catch (error) { res.status(500).json({ error: '文件上传失败' }); } }); ``` 这样,你就可以使用Mongoose接受上传文件了。当你发送一个POST请求到`/upload`路由时,它将保存上传的文件到磁盘上的指定目录,并将文件信息保存到MongoDB数据库中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值