Node.js上传Base64文件至PHP服务器,文件损坏无法读取求助
解决Base64编码文件上传至PHP服务器后损坏/0字节问题
常见错误原因
- Node.js端文件读取或Base64转换错误,比如使用非二进制编码读取文件,或添加了多余的Data URI前缀未处理
- axios请求头设置错误,导致PHP无法正确解析请求体
- PHP端未正确获取POST数据,或Base64解码不严格,或文件保存时使用文本模式而非二进制模式
- 传输过程中Base64字符串被转义或截断
正确实现步骤
Node.js端(文件转Base64并发送)
确保以二进制方式读取文件,转换为纯Base64字符串,通过JSON格式发送请求:
const fs = require('fs'); const axios = require('axios'); // 读取文件为Buffer并转Base64 const filePath = '/path/to/target/file'; const fileBase64 = fs.readFileSync(filePath, { encoding: 'base64' }); // 发送JSON格式请求 axios.post('http://your-domain/upload.php', { file_data: fileBase64, file_name: 'example.jpg' // 携带文件名,方便PHP保存 }, { headers: { 'Content-Type': 'application/json' } }) .then(res => console.log(res.data)) .catch(err => console.error('上传失败:', err));
PHP端(接收、解码并保存)
正确解析JSON请求体,严格解码Base64,以二进制模式保存文件:
<?php // 读取JSON请求体 $rawData = file_get_contents('php://input'); $request = json_decode($rawData, true); // 参数校验 if (empty($request['file_data']) || empty($request['file_name'])) { http_response_code(400); echo json_encode(['status' => 'error', 'msg' => '缺少必要参数']); exit; } // 移除可能的Data URI前缀(如果Node.js端添加了的话) $base64Str = preg_replace('#^data:.+;base64,#', '', $request['file_data']); // 严格解码Base64(失败返回false) $fileContent = base64_decode($base64Str, true); if ($fileContent === false) { http_response_code(400); echo json_encode(['status' => 'error', 'msg' => 'Base64解码失败']); exit; } // 确保保存目录存在 $saveDir = './uploads/'; if (!is_dir($saveDir)) { mkdir($saveDir, 0755, true); } $savePath = $saveDir . $request['file_name']; // 以二进制模式写入文件 if (file_put_contents($savePath, $fileContent, FILE_BINARY)) { echo json_encode(['status' => 'success', 'save_path' => $savePath]); } else { http_response_code(500); echo json_encode(['status' => 'error', 'msg' => '文件保存失败']); } ?>
关键注意事项
- Node.js端:必须使用
fs.readFileSync的base64编码读取,或读取Buffer后调用toString('base64'),禁止用utf8编码读取后转Base64。 - 请求头设置:axios发送JSON时必须指定
Content-Type: application/json,否则PHP无法通过php://input正确解析。 - PHP解码:启用
base64_decode的第二个参数true进行严格解码,能及时发现无效的Base64字符串。 - 文件保存:使用
FILE_BINARY标志确保以二进制模式写入,避免Windows系统下的换行符转换导致文件损坏。
内容的提问来源于stack exchange,提问作者FabricioG
相关产品推荐
相关产品推荐

