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

如何在Flutter应用中从Node.js的router.post接口下载文件?

实现Flutter从Node.js POST接口下载PDF文件

第一步:优化Node.js服务器代码

你的现有代码已经能生成PDF并输出到响应,但缺少必要的响应头,客户端无法正确识别为可下载文件。修改/criar接口如下:

router.post('/criar', function(req, res, next) {
    // 设置响应头,指定文件类型和下载属性
    res.setHeader('Content-Type', 'application/pdf');
    res.setHeader('Content-Disposition', 'attachment; filename="generated.pdf"');

    var doc = new PDFDocument();
    doc.pipe(res);

    // 确保字体路径正确,建议使用绝对路径或者确认字体文件存在
    doc.font('fonts/UbuntuMono-R.ttf')
        .fontSize(25)
        .text('Some text with an embedded font!', 100, 100);

    doc.end();
});

说明:

  • Content-Type告诉客户端这是PDF格式文件
  • Content-Disposition指定以附件形式下载,并设置默认文件名

第二步:Flutter端实现下载逻辑

1. 添加依赖

在pubspec.yaml中添加需要的包:

dependencies:
  flutter:
    sdk: flutter
  http: ^1.1.0
  path_provider: ^2.1.1
  open_file: ^3.3.2 # 可选,用于下载后打开文件

执行flutter pub get安装依赖。

2. 编写下载代码

import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';
import 'package:open_file/open_file.dart';

Future<void> downloadPdfFromServer() async {
  try {
    // 发送POST请求到Node.js接口
    final response = await http.post(
      Uri.parse('http://你的服务器IP:端口/criar'),
      // 如果需要传递参数,可以在这里添加body
      // body: {'key': 'value'},
    );

    if (response.statusCode == 200) {
      // 获取应用文档目录
      final directory = await getApplicationDocumentsDirectory();
      final filePath = '${directory.path}/generated.pdf';
      final file = File(filePath);

      // 将响应字节写入文件
      await file.writeAsBytes(response.bodyBytes);

      // 可选:打开下载后的文件
      await OpenFile.open(filePath);
    } else {
      throw Exception('请求失败,状态码:${response.statusCode}');
    }
  } catch (e) {
    print('下载出错:$e');
    // 这里可以添加错误提示逻辑,比如弹窗告知用户
  }
}

说明:

  • 替换http://你的服务器IP:端口/criar为实际的服务器地址
  • 如果POST接口需要参数,在body中添加键值对(需和Node.js端的参数解析对应)
  • path_provider用于获取安全的本地存储路径,避免权限问题
  • open_file包可快速打开下载好的PDF文件,提升用户体验

注意事项

  • 确保Node.js服务器的字体文件路径正确,若找不到字体,PDF生成会失败,建议使用绝对路径或者将字体文件放在正确位置
  • 测试时注意服务器和Flutter设备处于同一网络(比如本地测试用局域网IP)
  • 生产环境建议使用HTTPS协议,避免数据传输风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:01:20