點擊按鈕從數據庫讀取數據生成 Word 文檔,瀏覽器彈出「另存為」對話框,用戶自選保存路徑。
服務端不能直接寫入客戶端本地路徑:
Web 應用運行在服務器,FileOutputStream 只能寫服務器磁盤。下載本質是 HTTP 響應輸出流 + Content-Disposition 頭。
@WebServlet("/downloadWord")
public class WordDownloadServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 1. 設置響應頭
resp.setContentType("application/msword");
resp.setHeader("Content-Disposition",
"attachment; filename=\"" + URLEncoder.encode("報告.doc", "UTF-8") + "\"");
// 2. 獲取輸出流
try (OutputStream out = resp.getOutputStream()) {
// 3. 生成文檔直接寫入輸出流
Document document = new Document();
PdfWriter.getInstance(document, out); // iText 7 用 PdfWriter
document.open();
// 動態數據填充
document.add(new Paragraph("動態生成的 Word 內容"));
// ... 從數據庫讀取數據添加表格、圖片等
document.close();
}
}
}
Content-Disposition: attachment 觸發瀏覽器下載對話框filename 需 URLEncoder.encode 處理中文resp.getOutputStream(),無臨時文件、無路徑依賴PdfWriter.getInstance(doc, out)PdfWriter writer = new PdfWriter(out); PdfDocument pdf = new PdfDocument(writer); Document doc = new Document(pdf);Apache POI (XWPFDocument),iText 主攻 PDFWeb 下載 = 設置響應頭 + 寫 ServletOutputStream。拒絕服務端本地文件落地,擁抱流式傳輸。