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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:01:28