返回

Node.js + Koa2 实现文件上传、大文件切片上传、断点续传服务器端完整代码

前端

Node.js 和 Koa2:实现强大文件处理的详细指南

文件上传:简化客户端到服务器的数据传输

文件上传是网络应用程序中一项至关重要的功能,它允许用户将文件从他们的设备安全地传输到服务器。在 Node.js 中,利用其内置的 http 模块,我们可以轻松实现文件上传。为了在 Koa2 中增强文件处理能力,我们引入 koa-multer 中间件,为我们提供了一个健壮且灵活的工具来管理文件上传。

大文件切片上传:解决大文件传输的挑战

对于大文件,直接传输可能会遇到网络错误或超时问题。大文件切片上传通过将文件分割成更小的块来解决这一难题。Node.js 中的 busboy 库提供了强大的功能,可以轻松实现大文件切片上传,确保即使是庞大的文件也能可靠地传输。

断点续传:从中断处无缝恢复文件传输

断点续传是一种节省时间的技术,它允许在文件上传中断后从中断点恢复传输。利用 fs-write-stream-range 库,我们可以在 Node.js 中实现断点续传,从而避免重新上传整个文件,从而节省时间和带宽。

服务器端实现:一个健壮的文件处理解决方案

以下 Node.js 服务器端代码提供了一个完整的解决方案,涵盖了文件上传、大文件切片上传和断点续传:

const Koa = require('koa');
const Router = require('koa-router');
const fs = require('fs');
const path = require('path');
const busboy = require('busboy');
const fstream = require('fstream');

const app = new Koa();
const router = new Router();

router.post('/upload', async (ctx) => {
  const bb = busboy({headers: ctx.req.headers});

  const tmpdir = path.join(__dirname, 'tmp');

  bb.on('file', (fieldname, file, info) => {
    const filepath = path.join(tmpdir, info.filename);
    const ws = fstream.Writer(filepath);
    file.pipe(ws);

    ws.on('close', () => {
      fs.rename(filepath, path.join(__dirname, info.filename));
    });
  });

  bb.on('finish', () => {
    ctx.body = 'File uploaded successfully';
  });

  ctx.req.pipe(bb);
});

router.get('/download/:filename', async (ctx) => {
  const filepath = path.join(__dirname, ctx.params.filename);
  const stat = fs.statSync(filepath);

  ctx.set('Content-Length', stat.size);
  ctx.set('Content-Type', 'application/octet-stream');
  ctx.set('Content-disposition', `attachment; filename=${ctx.params.filename}`);

  const rs = fs.createReadStream(filepath);
  rs.pipe(ctx.res);
});

app.use(router.routes());

app.listen(3000);

使用指南:无缝集成文件处理

要利用这个解决方案,请遵循以下步骤:

  1. 将代码部署到您的服务器。
  2. 通过运行 npm install 安装必要的依赖项。
  3. 启动服务器:node app.js
  4. 使用 Web 浏览器或其他工具上传文件。
  5. 访问 http://localhost:3000/download/filename 从服务器下载文件。

常见问题解答

  • 如何指定文件上传路径?
    您可以在服务器端代码中指定 tmpdir 变量来设置上传文件的路径。

  • 如何处理大文件切片上传?
    busboy 库会自动将大文件分割成块,您无需手动处理。

  • 断点续传是如何工作的?
    fs-write-stream-range 库跟踪文件上传的进度,并允许您从中断点继续上传。

  • 如何下载文件?
    使用带有文件名的 GET 请求访问 /download/:filename 路由。

  • 如何配置服务器端代码?
    确保在服务器上安装了 Node.js 和 Koa2,并且代码中指定了正确的文件路径。