如何在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
相关产品推荐
相关产品推荐

