前言
处理用户选择的文件并将之上传至服务器,这属于是前端开发的基本功。
虽然现在有各种框架和插件能够很简单地实现文件上传功能,但是作为一个有追求的前端,还是有必要了解以下前端文件上传的基本原理的。 ^ - ^
使用 FormData 对象上传文件
我们可以使用 FormData 对象来创建一个表单数据对象,以便在提交表单时发送数据。
FormData 对象是基于 XMLHttpRequest 对象实现的,它可以用于在客户端或服务器端发送和接收表单数据。
我们可以使用 FormData 对象将文件数据封装成表单数据,并设置上传目标为一个新的表单元素。然后,将表单数据发送到服务器。
const fileInput = document.getElementById('fileInput');
const fileToUpload = fileInput.files[0];
const formData = new FormData();
formData.append('file', fileToUpload);
const xhr = new XMLHttpRequest();
xhr.open('POST', '/upload');
xhr.onload = function() {
if (xhr.status === 200) {
console.log('File uploaded successfully.');
} else {
console.log('Error uploading file.');
}
};
xhr.send(formData);
注意事项:
- FormData 对象主要用于在客户端上传文件和表单数据,它不适用于在服务器端接收数据。
- 在使用 FormData 对象上传文件时,需要确保文件大小不超过服务器允许的最大文件大小。
使用 Blob 对象 上传文件
除了使用 FormData 对象外,我们还可以将 File 对象转化为 Blob 对象后再上传
实现原理:使用 HTML5 的 File API 获取用户选择的文件,并将文件数据封装成一个 Blob 对象,然后将 Blob 对象上传。
// 获取用户选择的文件
const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', function(event) {
const file = event.target.files[0];
// 创建一个 Blob 对象
const blob = new Blob([file], { type: file.type });
// 创建一个 XMLHttpRequest 对象
const xhr = new XMLHttpRequest();
xhr.open('POST', '/upload');
xhr.onload = function() {
if (xhr.status === 200) {
console.log('File uploaded successfully.');
} else {
console.log('Error uploading file.');
}
};
xhr.send(blob);
});
扩展
通过上一篇文章对 File API 的学习,我们知道还有一个 FileReader 对象也可以读取本地文件,具体实现如下:
const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', function(event) {
const file = event.target.files[0];
// 创建一个 FileReader 对象
const reader = new FileReader();
reader.addEventListener('load', function(event) {
const blob = new Blob([event.target.result], {type: file.type});
// 创建一个 XMLHttpRequest 对象
const xhr = new XMLHttpRequest();
xhr.open('POST', '/upload');
xhr.onload = function() {
if (xhr.status === 200) {
console.log('File uploaded successfully.');
} else {
console.log('Error uploading file.');
}
};
xhr.send(blob);
});
reader.readAsArrayBuffer(file);
});
总结
以上就是前端常用的几种文件上传方案,我自己最常用的是使用 FormData 上传文件,你呢?
标签:文件,const,对象,前端,xhr,file,fileInput,上传 From: https://blog.51cto.com/bianchengsanmei/7543512