前端实现 Excel 的上传下载一般可以使用两种方式:
一种是借助服务器实现文件的上传和下载
一种是利用 HTML5 提供的 FileReader 和 Blob 对象实现本地文件的读取和下载。
1. 借助服务器实现文件的上传和下载
在此方案中,需要实现客户端将 Excel 文件上传至服务端,然后再由服务端返回 Excel 文件给客户端进行下载。常见的实现方式有:
- form 表单提交
- Ajax 实现提交
- 使用 fetch 实现上传与下载
下面是一个简单的基于 fetch 的上传和下载实现方法,这里假设后端接口已经能够正确解析接收到的文件并返回相应的结果:
// 上传文件
const uploadFile = async (file) => {const formData = new FormData();formData.append('file', file);try {const response = await fetch('/api/upload', {method: 'POST',body: formData,});const data = await response.json();if (data.success) {console.log('上传成功');} else {console.error('上传失败');}} catch (error) {console.error('上传出错');}
};// 下载文件
const downloadFile = async () => {try {const response = await fetch('/api/download', {method: 'GET',});const blob = await response.blob();const url = window.URL.createObjectURL(blob);const link = document.createElement('a');link.href = url;link.download = 'example.xlsx'; // 下载文件名link.click();window.URL.revokeObjectURL(url);} catch (error) {console.error('下载出错');}
};
2. 利用 HTML5 的File API,它提供的 FileReader 和 Blob 对象实现本地文件的读取和下载
我们可以利用 HTML5 提供的 FileReader 实现将 Excel 文件读入内存,再使用 Blob 和 URL.createObjectURL 实现文件内容的下载。具体实现如下:
excel文件上传
<input type="file" id="input-file" accept=".xlsx, .xls">
<button onclick="handleUpload()">Upload</button><script>
function handleUpload() {const fileInput = document.getElementById('input-file');const file = fileInput.files[0];if (!file) {alert('Please select a file!');return;}//new formdata()函数是FormData的构造函数,用来生成一个新的FormData对象const formData = new FormData();formData.append('file', file);// 发送文件到后端进行处理fetch('/upload', {method: 'POST',body: formData}).then(response => {alert('Upload success!');}).catch(error => {console.error(error);alert('Upload failed.');});
}
</script>
我们获取文件对象,将其添加到FormData对象中,并通过fetch()方法发送POST请求。这样就可以实现文件的上传。
注意:在上述代码中的 /upload
接口应该由后端进行实现。
Excel文件下载
1.通过fetch调用请求url,并得到response。
2.使用response.blob()方法将response转化为Blob数据类型。
3.将Blob数据类型转化为URL对象,用于创建下载链接。
4.创建<a>
元素,设置href属性为URL对象的URL,设置download属性为指定的文件名。
5.添加<a>
元素到页面中,模拟用户点击下载链接,下载文件。
6.删除<a>
元素。
<button onclick="handleDownload()">Download</button><script>
function handleDownload() {// 发送请求获取 Excel 文件流fetch('/download').then(response => {return response.blob();}).then(blob => {// 创建并下载 Excel 文件const url = window.URL.createObjectURL(new Blob([blob]));const link = document.createElement('a');link.href = url;link.download = 'example.xlsx';document.appendChild(link);link.click();document.removeChild(link);}).catch(error => {console.error(error);alert('Download failed.');});
}
</script>
注意:在上述代码中的
/download
接口同样应该由后端进行实现,且返回的应该是 Excel 文件的二进制流数据。
关于Blob:Blob是二进制大对象(binary large object)的缩写,它是一种数据库中用于存储大量二进制数据的数据类型。Blob数据类型通常用于存储图像、音频、视频等多媒体文件或者一些大型的文件数据。
Blob类型的数据可以通过一些特定的编程语言或者工具进行读写操作,通常可以通过二进制流的方式对数据进行读写。在数据库中,Blob类型的数据可以使用INSERT语句插入到表中,使用SELECT语句查询并提取出来。
需要注意的是,大量的Blob类型数据可能会占用较大的存储空间、处理时间和网络带宽等资源,因此在使用时需要谨慎考虑,尽可能地优化和压缩数据。