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

PHP Multipart上传PDF报错求助:我的实现代码是否存在问题?

你的代码存在几个关键问题,导致PDF文件上传失败,我来逐一拆解并给出修复方案:

1. 核心错误:未包含文件实际内容

你从Session中取出的$file如果是上传文件的临时路径或名称,当前代码完全没有把文件的二进制内容加入到Multipart请求里——这是导致上传失败的最根本原因!现在的$content只构建了表单字段的头部框架,却遗漏了文件本身的数据。

2. Multipart请求格式不完整

  • 文件字段缺少必要的Content-Type标识(PDF文件应指定application/pdf,这能帮助服务器识别文件类型)
  • 文件头部与内容之间需要用\r\n\r\n分隔,这是Multipart格式的规范要求
  • 文件内容之后必须添加换行符,才能正确分隔后续的表单字段

3. Session存储文件的潜在隐患

如果你的upload.php只是把$_FILES['fileToUpload']['tmp_name']存入Session,这个临时文件会在upload.php脚本执行结束后被PHP自动删除,后续发送请求时根本找不到对应的文件。正确的做法是读取文件内容存入Session,或者将文件移动到服务器的永久目录后存储路径。


修复后的完整代码示例

首先修正upload.php中存储文件到Session的逻辑:

<?php
session_start();
if(isset($_FILES['fileToUpload']) && $_FILES['fileToUpload']['error'] === UPLOAD_ERR_OK) {
    // 读取文件二进制内容存入Session
    $_SESSION['file_content'] = file_get_contents($_FILES['fileToUpload']['tmp_name']);
    // 同时存储文件名
    $_SESSION['file_name'] = $_FILES['fileToUpload']['name'];
    // 跳转到发送请求的页面
    header('Location: send_request.php');
    exit;
}
?>

然后是发送Multipart请求的代码:

<?php
session_start();

// 先检查Session中是否有有效文件数据
if(!isset($_SESSION['file_content']) || !isset($_SESSION['file_name'])) {
    die('没有可上传的PDF文件');
}

$file_content = $_SESSION['file_content'];
$file_name = $_SESSION['file_name'];

define('MULTIPART_BOUNDARY', '--------------------------' . microtime(true));
$headers = [
    'Content-Type: multipart/form-data; boundary=' . MULTIPART_BOUNDARY,
    // 可根据需求添加其他请求头,比如Authorization
];

// 构建符合规范的Multipart内容
$content = "--" . MULTIPART_BOUNDARY . "\r\n";
// 处理文件字段
$content .= "Content-Disposition: form-data; name=\"fileToUpload\"; filename=\"" . basename($file_name) . "\"\r\n";
$content .= "Content-Type: application/pdf\r\n\r\n";
$content .= $file_content . "\r\n";

// 处理额外的POST字段(foo=bar)
$content .= "--" . MULTIPART_BOUNDARY . "\r\n";
$content .= "Content-Disposition: form-data; name=\"foo\"\r\n\r\n";
$content .= "bar\r\n";

// 添加请求结束标记
$content .= "--" . MULTIPART_BOUNDARY . "--\r\n";

// 创建HTTP请求上下文
$context = stream_context_create([
    'http' => [
        'method' => 'POST',
        'header' => implode("\r\n", $headers),
        'content' => $content,
        'ignore_errors' => true, // 开启后能查看服务器返回的错误信息,方便调试
    ]
]);

// 发送请求(注意替换为实际的目标服务器URL)
$result = file_get_contents('https://your-target-server.com/upload', false, $context);
print_r($result);

// 可选:清理Session中的文件数据,避免占用资源
unset($_SESSION['file_content'], $_SESSION['file_name']);
?>

额外注意事项

  • 确保PHP配置中的upload_max_filesize和post_max_size值足够大,能容纳你要上传的PDF文件
  • 生产环境中不建议把大文件存在Session里,大文件会占用过多内存或磁盘资源,最好将文件保存到服务器磁盘后,再读取磁盘文件发送请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:32:27