如何通过PHP Curl Form Data将服务器存储的PDF发送至另一服务器
PHP Curl 发送服务器PDF文件至第三方API解决方案
核心问题梳理
你需要通过PHP Curl以Form Data形式,将服务器上的PDF文件发送到第三方API,当前卡在文件读取、Form Data构造及POST请求发送环节。你尝试的临时文件方案方向可行,但存在可优化的细节。
优化后的代码实现
如果PDF已在本地服务器,直接使用本地路径效率更高;如果是远程PDF,可优化临时文件逻辑:
// 情况1:PDF在本地服务器,直接使用绝对路径 $pdfFilePath = '/your/server/path/employee_manual3.pdf'; // 情况2:PDF是远程文件,先保存到临时文件(优化原有逻辑) // $remotePdfUrl = "https://url/employee_manual3.pdf"; // $tempFile = tempnam(sys_get_temp_dir(), 'PDF_'); // file_put_contents($tempFile, file_get_contents($remotePdfUrl)); // $tempPdfFile = $tempFile . '.pdf'; // rename($tempFile, $tempPdfFile); // $pdfFilePath = $tempPdfFile; // 初始化Curl $curl = curl_init(); // 构造CURLFILE对象,显式指定MIME类型和发送文件名 $uploadFile = new CURLFILE( $pdfFilePath, 'application/pdf', 'employee_manual3.pdf' // 发送到API时的文件名,可按需修改 ); curl_setopt_array($curl, [ CURLOPT_URL => 'https://API_URL', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_POST => true, // 用标准POST方式替代CUSTOMREQUEST CURLOPT_POSTFIELDS => [ 'file' => $uploadFile // 字段名需与API要求一致,比如有的API要求uploadedFile ], CURLOPT_HTTPHEADER => [ 'Authorization: Bearer API_TOKEN_HERE', // 不要手动设置multipart/form-data,Curl会自动生成带正确边界符的请求头 'Cookie: YOUR_COOKIE_VALUE' ], ]); $response = curl_exec($curl); // 捕获Curl错误,方便调试 if(curl_errno($curl)) { echo "请求错误:" . curl_error($curl); } curl_close($curl); echo $response; // 若使用了临时文件,请求完成后清理 // unlink($pdfFilePath);
关键注意事项
- 禁止手动设置
Content-Type: multipart/form-data:Curl会根据CURLFILE自动生成包含正确边界符的请求头,手动设置会导致API无法解析文件。 - 显式配置文件信息:
CURLFILE的第二个参数指定MIME类型(application/pdf),第三个参数设置发送到API的文件名,确保API能正确识别文件类型。 - 优先使用本地路径:如果PDF已在服务器本地,直接用绝对路径即可,无需临时文件,减少IO开销。
- 错误排查机制:添加
curl_errno和curl_error捕获请求异常,快速定位问题。 - 临时文件清理:若使用了临时文件,请求结束后用
unlink删除,避免占用服务器磁盘空间。
常见问题排查
- API返回文件不存在:检查
CURLOPT_POSTFIELDS里的字段名是否与API要求一致(比如部分API要求字段名为uploadedFile)。 - 请求超时:调整
CURLOPT_TIMEOUT的值,或检查服务器与API地址的网络连通性。 - 权限报错:确保PHP进程有读取本地PDF文件的权限,临时目录有写入权限。
内容的提问来源于stack exchange,提问作者Roshan Kumar Jha
相关产品推荐
相关产品推荐

