HTML5的File API为前端提供了原生操作本地文件的能力,不需要依赖第三方插件就能实现文件上传相关的功能,大幅简化了前端文件处理的流程。开发者可以通过该API获取用户选择的文件信息,还能读取文件内容、监听上传进度等。

File API核心相关接口
要实现文件上传,首先需要了解File API的几个核心接口,这些接口是功能实现的基础:
- FileList:用户通过文件选择控件选择文件后,返回的文件列表对象,是一个类数组结构,每个元素都是File对象。
- File:代表一个具体的文件对象,包含文件名、大小、类型、最后修改时间等属性。
- FileReader:用于读取File对象的内容,支持读取为文本、DataURL、二进制字符串等格式。
基础单文件上传实现
单文件上传是最基础的文件上传场景,只需要一个文件选择输入框和一个上传按钮即可实现,核心逻辑是获取用户选择的文件,再通过FormData包装后发送给后端。
HTML结构代码
首先编写基础的文件选择和上传播放结构:
<!-- 文件选择输入框,accept属性限制可选文件类型 --> <input type="file" id="singleFile" accept="image/*,.pdf"> <button id="uploadSingleBtn">上传单文件</button> <div id="singleResult"></div>
JavaScript实现逻辑
接下来编写上传的核心逻辑,获取文件后通过XMLHttpRequest发送到后端:
// 获取DOM元素
const singleFileInput = document.getElementById('singleFile');
const uploadSingleBtn = document.getElementById('uploadSingleBtn');
const singleResult = document.getElementById('singleResult');
uploadSingleBtn.addEventListener('click', () => {
// 获取用户选择的文件列表
const fileList = singleFileInput.files;
// 判断是否有选择文件
if (fileList.length === 0) {
singleResult.textContent = '请先选择要上传的文件';
return;
}
// 获取第一个文件对象
const file = fileList[0];
// 创建FormData对象,包装文件数据
const formData = new FormData();
// 第一个参数是后端接收的字段名,第二个是文件对象,第三个可选文件名
formData.append('uploadFile', file, file.name);
// 可以添加其他额外参数
formData.append('fileType', 'single');
// 创建XMLHttpRequest对象发送请求
const xhr = new XMLHttpRequest();
// 假设后端接口地址,这里替换为实际接口
xhr.open('POST', 'https://ipipp.com/upload');
// 监听上传完成事件
xhr.onload = function() {
if (xhr.status === 200) {
singleResult.textContent = '单文件上传成功,文件名:' + file.name;
} else {
singleResult.textContent = '单文件上传失败,状态码:' + xhr.status;
}
};
// 监听上传错误事件
xhr.onerror = function() {
singleResult.textContent = '单文件上传发生错误';
};
// 发送请求
xhr.send(formData);
});
多文件上传实现
多文件上传只需要在文件输入框添加multiple属性,然后遍历FileList中的所有文件依次添加到FormData中即可,其余逻辑和单文件上传基本一致。
HTML结构代码
<!-- multiple属性支持选择多个文件 --> <input type="file" id="multiFile" multiple accept="image/*"> <button id="uploadMultiBtn">上传多文件</button> <div id="multiResult"></div>
JavaScript实现逻辑
const multiFileInput = document.getElementById('multiFile');
const uploadMultiBtn = document.getElementById('uploadMultiBtn');
const multiResult = document.getElementById('multiResult');
uploadMultiBtn.addEventListener('click', () => {
const fileList = multiFileInput.files;
if (fileList.length === 0) {
multiResult.textContent = '请先选择要上传的文件';
return;
}
const formData = new FormData();
// 遍历所有选中的文件,添加到FormData
for (let i = 0; i < fileList.length; i++) {
const file = fileList[i];
// 多个文件可以用同一个字段名,后端通过数组接收
formData.append('uploadFiles', file, file.name);
}
formData.append('fileType', 'multi');
const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://ipipp.com/upload');
xhr.onload = function() {
if (xhr.status === 200) {
multiResult.textContent = '多文件上传成功,共上传' + fileList.length + '个文件';
} else {
multiResult.textContent = '多文件上传失败,状态码:' + xhr.status;
}
};
xhr.onerror = function() {
multiResult.textContent = '多文件上传发生错误';
};
xhr.send(formData);
});
上传进度监听实现
File API结合XMLHttpRequest的progress事件,可以监听文件上传的进度,给用户展示上传的百分比,提升体验。
// 以上面的单文件上传为例,添加进度监听
const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://ipipp.com/upload');
// 监听上传进度事件,upload是XMLHttpRequest的上传相关对象
xhr.upload.onprogress = function(event) {
if (event.lengthComputable) {
// 计算上传百分比
const percent = Math.round((event.loaded / event.total) * 100);
singleResult.textContent = '正在上传:' + percent + '%';
}
};
xhr.onload = function() {
if (xhr.status === 200) {
singleResult.textContent = '单文件上传成功,文件名:' + file.name;
} else {
singleResult.textContent = '单文件上传失败,状态码:' + xhr.status;
}
};
xhr.send(formData);
FileReader读取文件预览
如果需要在上传前预览图片等文件,可以使用FileReader读取文件内容,生成预览地址,不需要先上传到后端。
const fileInput = document.getElementById('singleFile');
fileInput.addEventListener('change', () => {
const file = fileInput.files[0];
if (!file) return;
// 判断是否为图片类型
if (!file.type.startsWith('image/')) {
alert('请选择图片文件');
return;
}
const reader = new FileReader();
// 读取为DataURL格式
reader.readAsDataURL(file);
reader.onload = function() {
// 创建图片元素展示预览
const img = document.createElement('img');
img.src = reader.result;
img.style.width = '200px';
// 先清空之前的预览
const previewDiv = document.getElementById('singleResult');
previewDiv.innerHTML = '';
previewDiv.appendChild(img);
};
reader.onerror = function() {
alert('文件读取失败');
};
});
注意事项
- 文件大小限制可以在前端通过
file.size属性判断,单位字节,比如限制10MB以内:if (file.size > 10 * 1024 * 1024) { alert('文件不能超过10MB'); } - 后端接口需要处理FormData格式的数据,不同后端框架的接收方式略有差异,需要和后端开发者约定好字段名。
- 如果上传大文件,建议结合分片上传的逻辑,将大文件拆分成多个小片段分别上传,避免请求超时。
File_APIHTML5文件上传前端文件处理JavaScript文件操作修改时间:2026-07-03 02:03:32