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

