8

我在使用 libCURL 时遇到了这种奇怪的行为。当我尝试通过在文件名的开头附加“@”来上传文件时(如 libCURL 的手册页中所述),而不是上传文件内容,libCURL 会发送文件名本身(以 @ 开头)。

这是在 Windows 2008 R2 上运行的,带有 xampp 版本 5.6.8,其中已编译 curl(curl 版本 7.40.0)。

这是相关的代码片段:

$post['pic'] = "@C:\\image.png";

$ret = curl_setopt( $ch, CURLOPT_POST, TRUE );
if (!$ret) die("curl_setopt CURLOPT_POST failed");
$ret = curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
if (!$ret) die("curl_setopt CURLOPT_POSTFIELDS failed");

$response = curl_exec( $ch );

此代码适用于 Linux,但不适用于 Windows Server 2008。

这是我得到的表单数据:

Content-Type: multipart/form-data; \\
boundary=------------------------c74a6af8b52d997a

--------------------------c74a6af8b52d997a
Content-Disposition: form-data; name="pic"

@C:\image.png
--------------------------c74a6af8b52d997a--

如您所见,我收到@C:\image.png的是内容而不是内容。

有谁知道为什么 libCURL 不会上传文件内容?

4

1 回答 1

5

来自curl-setopt的文档

CURLOPT_POSTFIELDS 要在 HTTP“POST”操作中发布的完整数据。要发布文件,请在文件名前加上 @ 并使用完整路径。文件类型可以通过使用格式为“;type=mimetype”的文件名来明确指定。此参数可以作为 urlencoded 字符串(如 'para1=val1¶2=val2&...')或作为字段名称作为键和字段数据作为值的数组传递。如果 value 是一个数组,则 Content-Type 标头将设置为 multipart/form-data。从 PHP 5.2.0 开始,如果文件以 @ 前缀传递给此选项,则 value 必须是数组。从 PHP 5.5.0 开始,不推荐使用 @ 前缀,并且可以使用 CURLFile 发送文件。通过将 CURLOPT_SAFE_UPLOAD 选项设置为 TRUE,可以禁用 @ 前缀以安全传递以 @ 开头的值。

该行为取决于 php 版本,现在不推荐使用 @ 前缀。

您应该使用CurlFile 类来设置 curl 请求的 CURLOPT_POSTFIELDS,如下所示:

$post['pic'] = new CurlFile('C:\\image.png');
$ret = curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
于 2015-08-02T16:50:50.563 回答