JavaScript文件上传与预览核心是FileReader(本地读取预览)和FormData(提交服务器)。FileReader支持readAsDataURL、readAsText(需指定UTF-8编码防乱码)、readAsArrayBuffer;FormData通过append添加文件,fetch或XHR上传,无需手动设Content-Type。
JavaScript 实现文件上传和读取预览,核心在于 File API(尤其是 FileReader)与 FormData 的配合使用。前者负责本地读取和预览,后者负责将文件提交到服务器。
适用于图片、文本等小文件的即时预览,不依赖服务器。
的 change 事件,获取 files[0]
new FileReader() 实例readAsDataURL()(适合图片预览)、readAsText()(适合文本内容)、readAsArrayBuffer()(适合二进制处理)读取文件onload 回调中拿到结果,更新页面元素(如 或 显示文本)示例(图片预览):
const input = document.querySelector('input[type="file"]');
input.addEventListener('change', (e) => {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = () => {
document.querySelector('#preview').src = reader.result;
};
reader.readAsDataURL(file);
});
实现真正的“上传”
,需配合后端接口接收文件(如 Express、PHP、Spring Boot 等)。
new FormData()
append('fieldName', file) 添加文件(字段名需与后端约定一致)formData.append('desc', '用户头像')
fetch 或 XMLHttpRequest 发送,注意不要设置 Content-Type(浏览器会自动设为 multipart/form-data 并带上 boundary)示例(fetch 上传):
const file = document.querySelector('input[type="file"]').files[0];
const formData = new FormData();
formData.append('avatar', file); // 后端接收字段名为 avatar
fetch('/upload', {
method: 'POST',
body: formData
})
.then(res => res.json())
.then(data => console.log('上传成功:', data));
中文文本文件若用 readAsText() 出现乱码,通常因未指定编码格式。
reader.readAsText(file, 'UTF-8')
'GBK'(需后端或用户明确告知),但浏览器原生只保证 UTF-8 和 US-ASCII 可靠Stream + TextDecoder 避免内存压力(高级场景)file.path 为空),仅能访问内容和元信息(name、size、type)Access-Control-Allow-Origin
XMLHttpRequest.upload.onprogress 或使用 fetch 配合 ReadableStream(现代方案)e.target.files 数组,逐个 append 到 FormData