在使用原生 JavaScript 实现文件上传时,主要涉及到 HTML 的 <input type="file">
元素与 JavaScript 的 FormData
对象结合使用。以下是关于原生 JS 文件上传的基础概念、优势、类型、应用场景以及常见问题及其解决方案的详细说明:
1. 文件输入元素 (<input type="file">
)
multiple
属性允许选择多个文件。2. FormData 对象
XMLHttpRequest
或 fetch
API 结合使用。3. 异步上传
以下是一个使用原生 JavaScript 实现文件上传的示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>文件上传示例</title>
</head>
<body>
<form id="uploadForm">
<input type="file" id="fileInput" name="file" />
<button type="submit">上传</button>
</form>
<div id="progress"></div>
<script>
document.getElementById('uploadForm').addEventListener('submit', function(e) {
e.preventDefault();
const fileInput = document.getElementById('fileInput');
const file = fileInput.files[0];
if (!file) {
alert('请选择一个文件');
return;
}
const formData = new FormData();
formData.append('file', file);
fetch('/upload', { // 替换为实际的上传接口
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
console.log('上传成功:', data);
document.getElementById('progress').innerText = '上传成功';
})
.catch(error => {
console.error('上传失败:', error);
document.getElementById('progress').innerText = '上传失败';
});
});
</script>
</body>
</html>
1. 上传进度无法显示
fetch
API 默认不支持上传进度事件。XMLHttpRequest
来监听上传进度,或者使用第三方库如 Axios。示例使用 XMLHttpRequest 显示进度:
const xhr = new XMLHttpRequest();
xhr.open('POST', '/upload');
xhr.upload.onprogress = function(event) {
if (event.lengthComputable) {
const percentComplete = (event.loaded / event.total) * 100;
document.getElementById('progress').innerText = `上传进度: ${percentComplete.toFixed(2)}%`;
}
};
xhr.onload = function() {
if (xhr.status === 200) {
document.getElementById('progress').innerText = '上传成功';
} else {
document.getElementById('progress').innerText = '上传失败';
}
};
xhr.send(formData);
2. 文件大小限制
client_max_body_size
)。示例前端验证文件大小:
const maxSize = 5 * 1024 * 1024; // 5MB
if (file.size > maxSize) {
alert('文件大小不能超过5MB');
return;
}
3. 跨域问题
使用原生 JavaScript 实现文件上传主要依赖于 <input type="file">
元素和 FormData
对象,结合 fetch
或 XMLHttpRequest
进行异步上传。通过合理处理上传进度、文件验证和跨域等问题,可以实现稳定且用户体验良好的文件上传功能。
领取专属 10元无门槛券
手把手带您无忧上云