当我尝试在Windows Server 2008中上传二进制文件时,LibCURL发送文件名而不是文件内容

bod*_*ydo 8 windows upload libcurl php-curl

我用libCURL得到了这种奇怪的行为.当我尝试通过在文件名的开头附加"@"来上传文件时(如libCURL的手册页中所述),而不是上传文件内容,libCURL自己发送文件名(开头是@).

这是在Windows 2008 R2上运行的,xampp版本为5.6.8,其卷曲编译为(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 );
Run Code Online (Sandbox Code Playgroud)

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

这是我得到的表单数据:

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

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

@C:\image.png
--------------------------c74a6af8b52d997a--
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我收到的@C:\image.png不是内容.

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

mpr*_*net 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发布,@ prefix现在已弃用.

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

$post['pic'] = new CurlFile('C:\\image.png');
$ret = curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
Run Code Online (Sandbox Code Playgroud)