You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React.js实现从服务器路径批量下载PDF并打包为Zip

实现服务器PDF文件夹批量打包下载方案

这个需求光靠前端肯定搞不定——浏览器受同源策略和安全限制,没法直接读取服务器上的文件夹内容。得前后端配合:前端触发下载请求,后端负责遍历指定文件夹、筛选PDF文件、打包成Zip,再把文件流返回给前端完成下载。下面给你分技术栈的具体实现:

后端实现(Node.js + Express 示例)

这是最常用的方案之一,需要用到 express 做服务器,archiver 来处理Zip打包:

  1. 先安装依赖:
npm install express archiver fs path
  1. 编写后端接口代码:
const express = require('express');
const archiver = require('archiver');
const fs = require('fs');
const path = require('path');
const app = express();

// 服务器上存储PDF的文件夹路径,根据实际情况修改
const PDF_FOLDER_PATH = path.join(__dirname, 'your-pdf-folder');

app.get('/api/download-all-pdfs', (req, res) => {
  // 初始化Zip打包器
  const zip = archiver('zip', { zlib: { level: 9 } });

  // 设置响应头,告诉浏览器这是一个Zip文件
  res.setHeader('Content-Type', 'application/zip');
  res.setHeader('Content-Disposition', 'attachment; filename="all-pdfs.zip"');

  // 把Zip流pipe到响应对象
  zip.pipe(res);

  // 读取文件夹里的所有文件,筛选出PDF
  fs.readdir(PDF_FOLDER_PATH, (err, files) => {
    if (err) {
      res.status(500).send('Failed to read PDF folder');
      return;
    }

    // 遍历文件,添加到Zip包
    files.forEach(file => {
      if (file.toLowerCase().endsWith('.pdf')) {
        const filePath = path.join(PDF_FOLDER_PATH, file);
        // 添加文件到Zip,保留原文件名
        zip.file(filePath, { name: file });
      }
    });

    // 完成打包
    zip.finalize();
  });
});

app.listen(3000, () => console.log('Server running on port 3000'));

前端实现(React 示例)

把你原来的单个下载按钮改成触发后端请求的按钮:

import React from 'react';

const DownloadAllPdfs = () => {
  const handleDownload = async () => {
    try {
      const response = await fetch('/api/download-all-pdfs');
      if (!response.ok) throw new Error('Download failed');

      // 把响应转为Blob对象
      const blob = await response.blob();
      // 创建临时下载链接
      const url = window.URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = url;
      a.download = 'all-pdfs.zip';
      document.body.appendChild(a);
      a.click();
      // 清理临时资源
      window.URL.revokeObjectURL(url);
      document.body.removeChild(a);
    } catch (err) {
      console.error(err);
      alert('Failed to download PDF zip');
    }
  };

  return (
    <button onClick={handleDownload}>
      Download All PDFs as Zip
    </button>
  );
};

export default DownloadAllPdfs;

其他后端技术栈思路

如果你用Python/Flask,可以用 zipfile 库来打包文件;用Java/Spring Boot的话,可以用 ZipOutputStream 来生成Zip流。核心逻辑都是:

  • 读取目标文件夹
  • 筛选PDF文件
  • 生成Zip文件流
  • 设置正确的响应头返回给前端

注意事项

  • 确保后端服务器有访问目标PDF文件夹的权限
  • 可以添加错误处理:比如文件夹不存在、没有PDF文件时返回友好提示
  • 大文件打包时要注意内存占用,尽量用流式处理(上面的Node.js示例就是流式的,不会把整个Zip加载到内存)

内容的提问来源于stack exchange,提问作者ABC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:02:54