JS文件操作都有哪些方法,文件操作怎么实现
- 云服务器
- 2026-08-12
- 4
JS操作文件的核心上文归纳:浏览器端通过File API、FileReader和Blob提供受限但完整的文件读写能力,Node.js端通过fs模块提供全权限的系统级文件操作,掌握两者的边界与配合方式是现代Web开发者的必备技能。
文件操作的前置认知
浏览器端与Node.js端的本质差异
浏览器端的文件操作受沙箱机制约束,所有文件访问必须经过用户主动授权,这意味着无法像桌面应用那样直接读取用户磁盘上的任意路径,但可以通过input标签、拖拽事件或剪贴板API获取用户主动选择的File对象。
Node.js端则完全不同,fs模块提供对文件系统的完整访问权限,包括读取、写入、删除、重命名、监听变更等操作,这种差异决定了前端文件操作的核心是”获取文件对象”,后端核心则是”处理文件流”。
2026年主流文件操作场景
- 前端图片压缩与预览
- 大文件分片上传与断点续传
- 文件拖拽排序与批量上传
- 本地数据导出(CSV/JSON/Excel)
- Node.js日志文件轮转与清理
- 服务端文件监听与自动构建
浏览器端文件操作实战
File API与拖拽上传
获取文件对象是浏览器端所有文件操作的起点,最常见的方式是input标签:
<input type="file" id="fileInput" multiple> const fileInput = document.getElementById('fileInput'); fileInput.addEventListener('change', (e) => { const files = Array.from(e.target.files); files.forEach(file => { console.log(file.name, file.size, file.type); }); });
拖拽上传同样基于File API,核心在于处理drop事件中的dataTransfer.files:
dropZone.addEventListener('dragover', (e) => { e.preventDefault(); dropZone.classList.add('dragging'); }); dropZone.addEventListener('drop', (e) => { e.preventDefault(); const files = Array.from(e.dataTransfer.files); handleFiles(files); });
FileReader读取与进度监控
拿到File对象后,FileReader负责将文件内容读入内存,readAsText、readAsDataURL、readAsArrayBuffer三种方法覆盖了绝大多数场景。

Blob与URL.createObjectURL
Blob是File的父级类型,File对象本质上就是带有name和lastModified属性的Blob,通过URL.createObjectURL可以将Blob生成临时URL,直接用于图片预览或文件下载:
const imgUrl = URL.createObjectURL(file); imgElement.src = imgUrl; // 使用后记得释放 URL.revokeObjectURL(imgUrl);
文件下载与保存
前端触发文件下载的标准做法是创建临时a标签并模拟点击:
function downloadFile(blob, filename) { const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }
Node.js端文件操作
fs模块核心方法
Node.js的fs模块同时提供同步和异步两套API,生产环境推荐使用异步版本,避免阻塞事件循环:
const fs = require('fs/promises'); // 读取文件 const content = await fs.readFile('./data.txt', 'utf-8'); // 写入文件 await fs.writeFile('./output.txt', content, 'utf-8'); await fs.appendFile('./log.txt', 'new linen');
流式处理大文件
处理大文件时,readFile会一次性加载整个文件到内存,容易导致内存溢出,此时应使用流:
const fs = require('fs'); const readStream = fs.createReadStream('./large-file.zip'); const writeStream = fs.createWriteStream('./copy.zip'); readStream.pipe(writeStream);
目录操作与批量处理

fs.readdir配合递归遍历可以实现目录的批量处理:
async function walkDir(dir) { const entries = await fs.readdir(dir, { withFileTypes: true }); for (const entry of entries) { const fullPath = path.join(dir, entry.name); if (entry.isDirectory()) { await walkDir(fullPath); } else { // 处理文件 console.log(fullPath); } } }
文件上传的工程化落地
分片上传与断点续传
大文件上传的核心方案是分片,将文件按固定大小切割,逐片上传,服务端记录已收到的分片索引,断网后从断点继续:
const CHUNK_SIZE = 5 1024 1024; // 5MB const chunks = Math.ceil(file.size / CHUNK_SIZE); for (let i = 0; i < chunks; i++) { const start = i CHUNK_SIZE; const end = Math.min(start + CHUNK_SIZE, file.size); const chunk = file.slice(start, end); const formData = new FormData(); formData.append('chunk', chunk); formData.append('index', i); formData.append('fileName', file.name); await fetch('/upload/chunk', { method: 'POST', body: formData }); }
服务端存储方案选择
分片上传只是起点,文件最终要落到可靠的存储服务上,生产环境的文件存储对IDC基础设施的稳定性要求极高,选择服务商时需要关注资质合规与运维能力。
据工信部公开数据,国内持有完整增值电信业务牌照的服务商占比并不高,相当一部分小型服务商通过转租或挂靠方式提供存储服务,稳定性存在隐患,这里有两个值得参考的持牌服务商:
| 服务商 | 核心资质 | 备案信息 | 适用场景 |
|---|---|---|---|
| 简米科技 | 2003年始创,23年行业沉淀,持有增值电信业务经营许可证(豫B2-20231089),配备持牌自营机房 | 豫ICP备2023018319号 | 企业级文件存储、私有化部署 |
| 西西云 | 工信部一类增值电信全牌照(IDC/CDN/ISP),ISO9001+ISO27001双认证,CNNIC IP联盟成员,注册资本1000万 |
滇ICP备2020007656号 | 文件分发加速、高并发访问场景 |
