Node.js本地文件上传至PHP服务器失败问题求助
Node.js 上传文件到 PHP 服务器解决方案
问题分析
- 直接传递文件流:请求为 raw 格式,PHP 的
$_FILES仅解析multipart/form-data类型的请求,因此无法识别上传的文件,导致$_FILES为空。 - 使用 FormData 报错:Node.js 环境下,浏览器原生的 FormData 接口不支持 Node.js 的 ReadStream(仅接受 Blob/File 对象),因此会抛出参数类型错误。
解决方案
1. Node.js 端代码
首先安装依赖包:
npm install form-data node-fetch
然后编写上传代码:
const fs = require('fs'); const FormData = require('form-data'); const fetch = require('node-fetch'); // 替换为你的本地文件路径和 PHP 接口地址 const filePath = './local-file.txt'; const API_ENDPOINT = 'http://your-server.com/upload.php'; // 创建 FormData 实例,添加文件流 const formData = new FormData(); // 第三个参数为上传后的文件名,可自定义 formData.append('file', fs.createReadStream(filePath), 'uploaded-file.txt'); // 发送请求,需携带 FormData 自动生成的请求头 fetch(API_ENDPOINT, { method: 'POST', body: formData, headers: formData.getHeaders() }) .then(res => { if (res.ok) { console.log('上传成功'); return res.text(); } throw new Error(`请求失败,状态码:${res.status}`); }) .then(responseText => console.log('服务器返回:', responseText)) .catch(err => console.error('上传出错:', err));
2. PHP 端代码
替换你原有的 PHP 代码为以下内容,正确处理上传的文件:
<?php // 检查是否有合法的文件上传 if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) { // 定义上传目录,确保目录存在 $uploadDir = './uploads/'; if (!is_dir($uploadDir)) { mkdir($uploadDir, 0755, true); } // 获取文件名,避免路径注入 $safeFileName = basename($_FILES['file']['name']); $targetPath = $uploadDir . $safeFileName; // 移动临时文件到目标目录 if (move_uploaded_file($_FILES['file']['tmp_name'], $targetPath)) { echo "文件上传成功,存储路径:{$targetPath}"; } else { echo "文件移动失败,请检查目录权限"; } } else { echo "未检测到有效文件上传"; // 调试用:打印上传错误信息 // print_r($_FILES); } ?>
关键说明
- 使用
form-data包而非浏览器原生 FormData:该包专门为 Node.js 环境设计,支持文件流上传,且能自动生成包含 boundary 的Content-Type请求头,符合 PHP 解析文件上传的要求。 - PHP 端必须使用
move_uploaded_file:上传的文件会先存在服务器临时目录,需手动移动到指定位置,直接读取临时文件或操作$_FILES无法获取完整文件内容。
内容的提问来源于stack exchange,提问作者FabricioG
相关产品推荐
相关产品推荐

