如何使用PHP的CURL以multipart/form-data格式向REST服务上传文件
PHP通过CURL以multipart/form-data格式上传文件到REST服务
你原来用@符号拼接文件的写法,在PHP 5.5及以上版本已经被废弃了——而且当CURLOPT_SAFE_UPLOAD(默认开启)生效时,这种写法会直接失效。推荐用CURLFile类来处理文件上传,这是官方认可的标准方式,兼容性和安全性都更好。
下面给你一套完整的可运行代码,包含表单字段处理、文件上传配置和响应处理:
// 先判断是否是POST提交,且文件已正确上传 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['audio'], $_FILES['image'])) { // 整理普通的表单字段 $postData = [ 'name' => $_POST['name'], 'bpm' => $_POST['bpm'], 'release' => $_POST['release'], 'genre' => $_POST['genre'], 'lableId' => $_POST['lableId'] ]; // 用CURLFile处理音频文件 $audioUpload = new CURLFile( $_FILES['audio']['tmp_name'], // 服务器上的临时文件路径 $_FILES['audio']['type'], // 文件的MIME类型 $_FILES['audio']['name'] // 原始文件名 ); $postData['audio'] = $audioUpload; // 同样处理图片文件 $imageUpload = new CURLFile( $_FILES['image']['tmp_name'], $_FILES['image']['type'], $_FILES['image']['name'] ); $postData['image'] = $imageUpload; // 初始化CURL,替换成你的REST服务地址 $curl = curl_init('https://your-rest-api-endpoint.com/upload'); // 设置CURL核心选项 curl_setopt($curl, CURLOPT_POST, true); // 启用POST请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); // 传入包含字段和文件的数组 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 将响应转为字符串返回,而不是直接输出 // 注:如果是测试环境的HTTPS服务,可临时关闭SSL验证(生产环境绝对不能这么做!) // curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 执行请求并获取结果 $response = curl_exec($curl); $httpStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE); // 检查请求是否出错 if (curl_errno($curl)) { echo 'CURL请求出错: ' . curl_error($curl); } else { echo '服务返回状态码: ' . $httpStatus . '<br>'; echo '服务响应内容: ' . $response; } // 记得关闭CURL资源 curl_close($curl); } else { echo '表单提交不完整,请检查文件是否正确上传'; }
几个关键注意点:
- 为什么不用
@了?:PHP 5.5开始默认开启CURLOPT_SAFE_UPLOAD,此时@会被当作普通文本处理,无法识别为文件路径,必须用CURLFile来封装文件信息。 - 不需要手动设置Content-Type:当你给
CURLOPT_POSTFIELDS传入包含CURLFile的数组时,CURL会自动生成正确的multipart/form-data请求头,不用自己拼接。 - 一定要做验证:实际开发中要对
$_POST的字段做合法性校验,对$_FILES的文件类型、大小做限制,防止恶意上传或者无效数据。 - HTTPS环境注意:生产环境下不要关闭
CURLOPT_SSL_VERIFYPEER,可以通过CURLOPT_CAINFO指定CA证书路径,保证请求的安全性。
内容的提问来源于stack exchange,提问作者John Dean
相关产品推荐
相关产品推荐

