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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:13:25