JavaScript无法直接访问本地文件系统,需通过触发用户选择,利用FileList和FileReader读取文件内容,或用FormData+fetch上传文件;大文件可分片处理,注意安全限制与跨域配置。
JavaScript 本身不能直接访问用户本地文件系统(出于安全限制),但可以通过
让用户主动选择文件,然后用
和
API 读取内容,再通过
+
或
上传到服务器。
如何让用户选择并读取本地文件
核心是监听文件输入框的
事件,获取
,再用
异步读取:
使用
触发选择(可加
、
属性限制类型)
是一个
,每个项是
对象(继承自
)
用
的
(文本)、
(Base64)、
(二进制)等方法读取
监听
获取结果,
处理失败
示例(读取文本文件):
const input = document.getElementById('fileInput');input.addEventListener('change', e => {const file = e.target.files[0];if (!file) return;const reader = new FileReader();reader.onload = () => {document.getElementById('output').textContent = reader.result;};reader.onerror = () => console.error('读取失败');reader.readAsText(file, 'UTF-8');});
立即学习
“
Java免费学习笔记(深入)
”;
Comet AI 浏览器
下载 Comet AI 浏览器,体验由 Perplexity AI 驱动的革命性上网方式。内置 AI 助手可实时总结网页、跨标签页对比信息、自动执行任务。告别繁琐操作,让 AI 成为你的浏览副驾,大幅提升研究与工作效率。支持 Windows、macOS、Android 和 iOS。
下载
如何上传文件到服务器
读取不是必须步骤——如果只是上传,可跳过
,直接把
对象塞进
:
可以原生携带
或
,
浏览器
自动设置正确的
和边界(boundary)
用
发送 POST 请求,
直接传
实例(不用设
头,否则会出错)
后端需按 multipart/form-data 解析(如 Express 用
,Node.
js
原生需解析流)
示例(上传单个文件):
const form = new FormData();form.append('upload', file); // 'upload' 是后端接收字段名fetch('/api/upload', {method: 'POST',body: form}).then(res => res.json()).then(data => console.log('上传成功:', data));
如何处理大文件或分片上传
避免内存溢出和超时,可将大文件切片(Blob.slice()),逐片上传并记录进度:
用
获取子
(注意:返回的是
,不是
,但可直接 append 到 FormData)
每片带上序号、总片数、文件唯一标识(如 hash),便于后端合并
结合
的
和
支持取消
用
获取上传进度(
目前不原生支持上传进度)
注意事项和常见问题
对象只在用户触发选择后存在,刷新页面即丢失;如需持久化,得靠后端存储或 IndexedDB 缓存内容(非路径)
不能读取或上传文件的绝对路径(出于隐私保护,
在浏览器中始终为
)
跨域
上传需服务端配置 CORS(如
),且带凭证时要设
移动端要注意
属性对摄像头/相册的调用效果(如
可唤起拍照)
不复杂但容易忽略。
FileFileReaderFormDatafetchXMLHttpRequestchangeFileListFileReadermultipleacceptevent.target.filesFileListFileBlobFileReaderreadAsText()readAsDataURL()readAsArrayBuffer()onloadonerrorFileReaderFileFormDataFormDataFileBlobContent-TypefetchbodyFormDataContent-Typemulterfile.slice(start, end)BlobBlobFilefetchsignalAbortControllerXMLHttpRequest.upload.onprogressfetchFilefile.path""Access-Control-Allow-Origincredentials: 'include'acceptaccept="image/*"