node实现文件上传(1)

1、FormData对象

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

​ (1)是一个构造函数:new FormData()

(2)常用的API:

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

        ​ FormData.get(key):获取key对应的值

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

​         FormData.has(key):判断formdata中是否有key

 

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:上传的文件名

举个例子

  1. 上传图片:
  2. 将图片文件上传到服务器端的指定目录
  3. 将图片文件名和服务器的地址进行拼接
  4. 将拼接后的图片的路径响应给客户端,在div中显示出来

---客户端

 -----服务器端

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

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

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

 

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

 

二、Express实现文件下载

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

 

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

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大文件的断点上传主要是利用HTTP协议的Range请求头来实现,其中Range请求头用于指定请求的数据范围,可以用于服务器响应部分内容或者支持分块下载。通过Range请求头,客户端可以在上传文件时只上传文件的某个部分,或者在上传过程中出现中断后可以继续从中断处继续上传。 以下是用Node.js实现大文件断点上传的示例代码: ```javascript const fs = require('fs'); const http = require('http'); const FILE_PATH = '/path/to/large/file'; const PORT = 3000; const server = http.createServer((req, res) => { if (req.url === '/upload') { const range = req.headers.range; if (range) { const parts = range.replace(/bytes=/, '').split('-'); const start = parseInt(parts[0], 10); const end = parts[1] ? parseInt(parts[1], 10) : fs.statSync(FILE_PATH).size - 1; const chunkSize = (end - start) + 1; const fileStream = fs.createReadStream(FILE_PATH, { start, end }); res.writeHead(206, { 'Content-Range': `bytes ${start}-${end}/${fs.statSync(FILE_PATH).size}`, 'Accept-Ranges': 'bytes', 'Content-Length': chunkSize, 'Content-Type': 'application/octet-stream' }); fileStream.pipe(res); } else { const fileStream = fs.createReadStream(FILE_PATH); res.writeHead(200, { 'Content-Length': fs.statSync(FILE_PATH).size, 'Content-Type': 'application/octet-stream' }); fileStream.pipe(res); } } }); server.listen(PORT, () => { console.log(`Server running at http://localhost:${PORT}/`); }); ``` 在客户端实现文件上传时,需要分段上传每个文件分片,并记录当前上传进度。如果上传过程中出现中断,可以记录已上传的分片,下次继续上传时从中断处继续上传。以下是客户端实现文件上传的示例代码: ```javascript const fs = require('fs'); const http = require('http'); const path = require('path'); const FILE_PATH = '/path/to/large/file'; const CHUNK_SIZE = 1024 * 1024; // 1MB const PORT = 3000; let uploadedBytes = 0; let totalBytes = fs.statSync(FILE_PATH).size; let fileStream; const uploadChunk = (start, end) => { const options = { hostname: 'localhost', port: PORT, path: '/upload', method: 'POST', headers: { 'Content-Type': 'application/octet-stream', 'Content-Length': end - start + 1, 'Content-Range': `bytes ${start}-${end}/${totalBytes}` } }; const req = http.request(options, (res) => { if (res.statusCode === 200 || res.statusCode === 206) { uploadedBytes += end - start + 1; console.log(`Uploaded ${uploadedBytes} bytes of ${totalBytes} bytes`); if (uploadedBytes === totalBytes) { console.log('Upload complete!'); } else { uploadNextChunk(); } } else { console.error(`Error uploading chunk ${start}-${end}: ${res.statusCode} ${res.statusMessage}`); } }); fileStream.pipe(req); }; const uploadNextChunk = () => { if (uploadedBytes === totalBytes) { return; } const start = uploadedBytes; const end = Math.min(start + CHUNK_SIZE - 1, totalBytes - 1); console.log(`Uploading chunk ${start}-${end}`); fileStream = fs.createReadStream(FILE_PATH, { start, end }); uploadChunk(start, end); }; const startUpload = () => { console.log(`Starting upload of ${path.basename(FILE_PATH)} (${totalBytes} bytes)`); uploadNextChunk(); }; startUpload(); ``` 注意,以上代码只是示例代码,实际项目中还需要考虑错误处理、性能优化、安全性等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值