一、上传
1.上传数据的封装
在上传文件时,最常用的方式是使用 FormData
对象,它会自动将请求头中的 Content-Type
请求头指定为multipart/form-data
服务端
在所有分片上传完毕后,服务器端会收到所有分片并合并。服务器可以根据 filename
和 chunkIndex
来识别每个分片,并按顺序合并它们。
const fs = require("fs"); const path = require("path"); const express = require("express"); const app = express(); const uploadDir = "uploads/"; // 保存分片的临时目录app.post("/upload-chunk", (req, res) => {const { filename, chunkIndex, totalChunks } = req.body;const chunk = req.files.file; // 获取上传的分片文件// 将每个分片存储到临时文件夹const chunkPath = path.join(uploadDir, `${filename}.part${chunkIndex}`);fs.writeFileSync(chunkPath, chunk.data);// 检查是否所有分片都上传完成if (parseInt(chunkIndex) === totalChunks - 1) {// 合并所有分片const filePath = path.join(uploadDir, filename);const writeStream = fs.createWriteStream(filePath);for (let i = 0; i < totalChunks; i++) {const partPath = path.join(uploadDir, `${filename}.part${i}`);const data = fs.readFileSync(partPath);writeStream.write(data);fs.unlinkSync(partPath); // 删除已合并的分片}writeStream.end();res.send("文件上传成功并合并完成!");} else {res.send("分片上传成功!");} });app.listen(3000, () => {console.log("Server started on http://localhost:3000"); });
二、下载
1. 使用 <a>
标签的 download
属性
这是实现文件下载最简单的方式。<a>
标签的 download
属性可以强制浏览器下载文件而不是直接打开文件。
<a href="path/to/file.pdf" download="filename.pdf">下载文件</a>
Blob
对象,并生成一个 URL 来进行下载。使用 Blob 和 URL.createObjectURL 生成下载链接
function downloadBlob(data, filename, mimeType) {const blob = new Blob([data], { type: mimeType });const url = URL.createObjectURL(blob);const a = document.createElement("a");a.href = url;a.download = filename;document.body.appendChild(a);a.click();document.body.removeChild(a);URL.revokeObjectURL(url); // 释放 URL }// 使用示例 const data = "Hello, this is a text file!"; downloadBlob(data, "example.txt", "text/plain");
2.使用ajax和 Blob 实现文件下载
不推荐使用该方法。下载速度比方法1要慢,要等ajax接收完文件再调用浏览器的文件保存api,文件较大时点击后可能需要很长时间才有反应,并且下载传输过程中出现问题后,无法断点续传。
async function downloadFile(url, filename) {const response = await fetch(url);const blob = await response.blob();const a = document.createElement("a");a.href = URL.createObjectURL(blob);a.download = filename;document.body.appendChild(a);a.click();document.body.removeChild(a);URL.revokeObjectURL(a.href); }// 使用示例 downloadFile("path/to/file.pdf", "downloaded_file.pdf");