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不会上传文件内容?
从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)