类 CURLFile 的对象无法转换为字符串。

4
如何通过cURL实现图片上传?
我正在使用沙盒api将pdf文件转换为.txt文件。如果我使用"https://s3.amazonaws.com/sample.pdf"作为pdf的路径来设置$sourceFile变量,则一切正常。但是,如果我使用系统路径“test.pdf”,则它不起作用。

我试图通过curl_file_create来解决问题,但会出现以下错误:

可恢复致命错误:无法将类CURLFile的对象转换为字符串。

我正在使用PHP版本7.3.0

<?php
error_reporting(E_ALL);
$endpoint = "https://api.xxx.com/v1/jobs";
$apiKey = "GiVU******FR48H";
$sourceFile = "https://s3.amazonaws.com/sample.pdf";//new CurlFile("test.pdf");
$targetFormat = "txt";


$postData = array(
  "source_file" => $sourceFile,
  "target_format" => $targetFormat
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $endpoint);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERPWD, $apiKey . ":");
$body = curl_exec($ch);
curl_close($ch);
$response = json_decode($body, true);
echo "Response:\n---------\n";
echo"<pre>";
print_r($response);
?>

Response: ---------
Array
(
    [id] => 8442473
    [key] => GiVU******FR48H
    [status] => initialising
    [sandbox] => 
    [created_at] => 2019-11-12T10:35:01Z
    [finished_at] => 
    [import] => Array
        (
            [id] => 671784
            [url] => https://s3.amazonaws.com/sample.pdf
            [status] => initialising
        )

    [target_files] => Array
        (
        )

    [target_format] => txt
    [credit_cost] => 0
)

以上示例给我输出结果很好。如果我从系统路径中替换amazonaws,那么它就不会给出任何响应。

你缺少内容类型;curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: image/jpeg")); - IsThisJavascript
1个回答

2

CURLOPT_SAFE_UPLOAD 总是设置为 false,因此 curl 期望文件被传递为字符串 (@/path/to/file)。在您的情况下,代码发送文件作为对象,因为它使用了可用的 curl_file_create()

当将 CURLOPT_SAFE_UPLOAD 设置为 false 时,不应使用 curl_file_create()(它是向后兼容的标志)。

另外,请尝试在设置 CURLOPT_SAFE_UPLOAD 后设置 CURLOPT_POSTFIELDS请参见此处的原因)。

PHP 5.x 已经不再受支持,我建议摆脱旧语法(@/path/to/fileCURLOPT_SAFE_UPLOAD = false),并始终使用 curl_file_create()


1
我看到了多个问题: 1)您没有在路径前面设置@,2)CURLOPT_SAFE_UPLOADCURLOPT_POSTFIELDS之后设置(您错过了我的答案中的这一部分)。尝试修复它们,然后更新结果。 - Luxian
我运行了你的脚本并得到了以下信息 - [message] => 文件大小超出了当前计划的最大文件大小限制。然后我删除了这个选项 - curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); - Dmitry Leiko
@Martin,自从您切换到新的上传方法(CURLFile)后,您不再需要设置CURLOPT_SAFE_UPLOAD。请将其删除。我不太确定您的情况是什么,请您同时发布两种情况下的响应结果。我怀疑amazonaws请求只是将URL作为字符串发送。 - Luxian
@Dmitry,看起来像是服务器限制,上传脚本可能是正常工作的。 - Luxian
@Luxian 我只是复制和粘贴。我用小尺寸的PDF运行它,但它没有给出任何错误或响应。 - Nirdesh Kumawat
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接