php - 如何调试错误“已弃用:curl_setopt():”
问题描述
我有一个通过 API 上传 PDF 文件的旧脚本。我收到错误消息:
不推荐使用:curl_setopt():不推荐使用 @filename API 进行文件上传。请改用 CURLFile 类。
这是相关代码(我认为这就是全部)。错误指向以下行:curl_setopt( $curl_handle, CURLOPT_POSTFIELDS, $postFields )
。
//Upload the file
function uploadPdf( $api, $lead_id, $rev, $existing_files = array() ) {
if ( ! file_exists( SERVERPATH . "quotes/quote-". $this->id .".pdf" ) )
$this->createQuotePdf();
$files_array = array( array( 'entityType'=>'files', 'name'=>"quote-". $this->id .".pdf" ) );
// if ( $this->upfile && ! file_exists( SERVERPATH . "uploads/" . $upfile ) )
// $files_array[] = array( array( 'entityType'=>'files', 'name'=> $upfile ) );
foreach ( $existing_files as $file ) {
$files_array[] = (array) $file;
}
//this request gives us the URLs to upload to
$result = $api->editLead( array( 'leadId' => $lead_id, 'rev'=>'REV_IGNORE', 'lead'=> array( 'file' => $files_array ) ) );
//Upload the Quote file
$postFields = array();
$postFields['file'] = "@" . SERVERPATH . "quotes/quote-". $this->id .".pdf";
$postFields['type'] = "application/pdf";
$curl_handle = curl_init();
$file = array_pop( $result->file );
curl_setopt( $curl_handle, CURLOPT_URL, $file->uri );
curl_setopt( $curl_handle, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl_handle, CURLOPT_POST, true );
curl_setopt( $curl_handle, CURLOPT_USERPWD, USERNAME . ":" . API_KEY );
curl_setopt( $curl_handle, CURLOPT_POSTFIELDS, $postFields );
//execute the API Call
$return = curl_exec( $curl_handle ) ;
$this->uploadUpfile($api, $lead_id);
return $return;
}
我的知识很基础。但我试图替换:
$postFields['file'] = "@" . SERVERPATH . "quotes/quote-". $this->id .".pdf";
$postFields['type'] = "application/pdf";
和
$postFields['file'] = curl_file_create(SERVERPATH . "quotes/quote-". $this->id .".pdf", 'application/pdf', SERVERPATH . "quotes/quote-". $this->id .".pdf");
执行上述操作已经消除了错误,但是我实际上无法打开上传文件的潜在问题仍然存在。所以我想知道我是否做错了什么?
解决方案
从 PHP 5.5 及更高版本开始,您应该使用 CURLFile 上传文件,我已经发布了一个完整的答案,描述了 CURLFile 和普通文件上传,您可以在此处查看该答案。
您可以使用 CURLFile 如下,随时根据需要调整代码:
//Upload file using CURLFile
function upload($target, $postFields){
$file = $postFields['file'];
$cFile = new CURLFile($file,$postFields['type'], $file);
$data = array(
'file' => $cFile,
'type' => $postFields['type'],
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $target);
curl_setopt($curl, CURLOPT_HEADER , true); //we need header
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // stop verifying certificate
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true); // enable posting
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // post images
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // if any redirection after upload
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true);
$r = curl_exec($curl);
if (curl_errno($curl)) {
$error = curl_error($curl);
print_r($error);
} else {
// check the HTTP status code of the request
$resultStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($resultStatus != 200) {
print_r($resultStatus);
}else{
//successfull
print_r($r);
}
}
curl_close($curl);
}
由于您的文件和文件类型位于名为 的数组中$postFields
,因此您可以调用上述函数,如下所示:
upload($target, $postFields);
$target
您调用上传文件的链接在哪里。
推荐阅读
- r - 闪亮的模块:从外部访问和更改位于模块服务器功能内的反应值?
- compilation - 查找用于 macOS 的预编译或编译 Tcl/Tk 框架
- c# - 更新属性以使加载不会停止 UI 的正确方法?
- azure - 无法从 Azure 容器实例连接到 Azure SQL 数据库
- python - 我如何使用scrapy shell和python登录这个网站 - 401错误?
- c++ - 如何在 C++ 中循环对
- java - Spring Boot 使用多个对象上传多个文件
- android - 从本地数据库Android检索数据的正确方法是什么?
- ios - 反向地理编码解释
- javascript - 从网页中读取动态创建的内容