【问题标题】:PHP: Send uploaded file with curl without uploading to initial serverPHP:使用 curl 发送上传的文件而不上传到初始服务器
【发布时间】:2026-02-13 07:15:01
【问题描述】:

我目前有一个允许文件上传的网站。当用户提交表单时,我运行一个 php 脚本向我的 api 发送 curl 请求。

目前php请求是这样的:

$params = array(
    'media' => "@" . $_FILES['media']['tmp_name']
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

API 只是检查$_FILES 字段,然后抓取媒体并运行move_uploaded_file

所以文件直接从用户提交的表单到 curl 到 api 服务器,在到达 api 服务器之前,文件永远不会被实际上传(除了被放置在表单提交和 curl 请求之间的 tmp 文件夹中)。

这一切都适用于将文件上传到 api 服务器,但问题是服务器认为文件的扩展名是 .tmp,而不是像 png 之类的东西,因为那是 curl 请求发送的文件。

如何在不预先上传文件的情况下发送文件,以便 api 服务器知道实际发送的是什么文件?

【问题讨论】:

  • 为了清楚起见,being placed in a tmp folder 实际上是指being uploaded to your server。您可以使用它,作为一个选项,您可以阅读它并将其作为字符串发布,请参见此处:*.com/questions/3085990/…

标签: php file-upload curl


【解决方案1】:

两种方式:

  • 重命名 tmp 文件。您可以访问它,因此重命名它很简单:rename(oldname, newname)
  • 发送一个 mimetype。格式为:@filename;type=image/png 表示 png。

如果您关心文件名,请选择第一个选项,如果您只关心 mime 类型,请选择第二个。

【讨论】:

  • 谢谢,非常直接。最后只是重命名它。