Node.js express框架多文件上传、拖拽、剪切板、webSocket文件上传

大家早上好,我是秀菜今天继续带来2种文件上传

1.formData多文件、拖拽、剪切板

var express = require('express');
var router = express.Router();
var multer = require('multer');
var path = require('path');


// 多文件上传/拖拽上传/剪切板上传
const storage = multer.diskStorage({
    destination: 'upload',
    filename(req, file, cb) {
        // 获取文件名后缀
        const ext = path.extname(file.originalname);
        // 随机生成文件名
        const uniqueSuffix = Date.now() + '_' + Math.round(Math.random() * 1e9);
        const fileName = `${uniqueSuffix} + ${ext}`;
        cb(null, fileName)
    }
})

// 多文件上传/拖拽上传
const upload = new multer({ storage })
router.post("/upload", upload.array('files'), (req, res) => {
    const files = req.files
    const name = req.body.name
    const email = req.body.email
    console.log(files, name, email);
    if (!files) {
        res.send('File not found')
        return;
    }
    res.send('文件上传成功')
})


module.exports = router;

2.webSocket文件上传

var express = require('express');
// webSocket文件上传
const WebSocket = require('ws');
const fs = require('fs');
const wss = new WebSocket.Server({ port: 3001 });

// 初始websocket文件上传
// wss.on('connection', (ws) => {
//   ws.on('message', (message) => {
//     const fileData = message;
//     const uniqueSuffix = Date.now() + '_' + Math.round(Math.random() * 1e9);
//     fs.writeFile(`./upload/${uniqueSuffix}.png`, fileData, (err) => {
//       if (err) {
//         console.log(err);
//       } else {
//         console.log('文件上传成功');
//       }
//     })
//   })
// })

// websocket文件后缀动态上传
// wss.on('connection', (ws) => {
//     ws.on('message', (message) => {
//         const fileInfo = JSON.parse(message);
//         const fileData = fileInfo.data;
//         // 现在,反转过程以获取原始的 Uint8Array
//         const reversedUint8Array = stringToUint8Array(fileData);

//         const uniqueSuffix = Date.now() + '_' + Math.round(Math.random() * 1e9);
//         const fileName = `${uniqueSuffix}.${fileInfo.name.split('.')[1]}`
//         fs.writeFile(`./upload/${fileName}`, reversedUint8Array, (err) => {
//             if (err) {
//                 console.log(err);
//             } else {
//                 console.log('文件上传成功');
//             }
//         })
//     })
// })

// function stringToUint8Array(str) {
//     const charArray = str.split('').map(char => char.charCodeAt(0));
//     return new Uint8Array(charArray);
// }


// websocket文件分段上传接口
// wss.on('connection', (ws) => {
//     let fileName = ''; //保存文件名称
//     let totalChunks = 0;  // 总快数
//     let receivedChunks = 0;    // 已接收到的块数
//     let writableStream = null;    // 可写流用于写入文件
//     ws.on('message', (message) => {
//         if (Buffer.isBuffer(message)) {
//             // fileName等于空数据的时候就代表没有传入数据
//             if (fileName === '') {
//                 const metaBuffer = message.toString();
//                 const meta = JSON.parse(metaBuffer);

//                 // 提取文件名和总块数
//                 fileName = meta.fileName;
//                 totalChunks = meta.totalChunks;
//                 // 创建可写流,用于写入文件
//                 writableStream = fs.createWriteStream(`./upload/${fileName}`)
//             } else {
//                 // 将文件块数据写入可写流
//                 writableStream.write(message);
//                 receivedChunks++;
//                 console.log(receivedChunks);
//                 if (receivedChunks === totalChunks) {
//                     // 关闭可写流保存文件
//                     writableStream.end();
//                     console.log(`文件保存成功:${fileName}`);
//                     writableStream = null;
//                     // 重设相关变量
//                     fileName = '';
//                     totalChunks = 0;
//                     receivedChunks = 0;
//                 }
//             }
//         }
//     })
//     ws.on('error', (error) => {
//         console.error('WebSocket 错误:' + error);
//         // 如果可写流存在,则关闭可写流
//         if (writableStream) {
//             writableStream.end();
//             writableStream = null;
//         }
//     })
// })


// 文件分段上传进度条展示接口
// wss.on('connection', (ws) => {
//     let fileName = ''; //保存文件名称
//     let totalChunks = 0;  // 总快数
//     let receivedChunks = 0;    // 已接收到的块数
//     let writableStream = null;    // 可写流用于写入文件
//     ws.on('message', (message) => {
//       if (Buffer.isBuffer(message)) {
//         // fileName等于空数据的时候就代表没有传入数据
//         if (fileName === '') {
//           const metaBuffer = message.toString();
//           const meta = JSON.parse(metaBuffer);
  
//           // 提取文件名和总块数
//           fileName = meta.fileName;
//           totalChunks = meta.totalChunks;
//           // 创建可写流,用于写入文件
//           writableStream = fs.createWriteStream(`./upload/${fileName}`)
//         } else {
//           // 将文件块数据写入可写流
//           writableStream.write(message);
//           receivedChunks++;
  
//           // 进度设置
//           let progress = 0;
  
//           console.log(receivedChunks);
//           if (receivedChunks === totalChunks) {
//             // 关闭可写流保存文件
//             writableStream.end();
//             console.log(`文件保存成功:${fileName}`);
//             writableStream = null;
//             // 重设相关变量
//             fileName = '';
//             totalChunks = 0;
//             receivedChunks = 0;
//             progress = 100;
//           } else {
//             progress = Math.floor((receivedChunks / totalChunks) * 100);
//           }
//           ws.send(JSON.stringify({ type: 'progress', progress }))
//         }
//       }
//     })
//     ws.on('error', (error) => {
//       console.error('WebSocket 错误:' + error);
//       // 如果可写流存在,则关闭可写流
//       if (writableStream) {
//         writableStream.end();
//         writableStream = null;
//       }
//     })
//   })

module.exports = router;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值