cURL 未将文件发送到 API 调用



我正在构建一个从API运行的移动站点,并有一个API CALL处理程序类,该类执行我从主要函数文件运行的所有调用。

这里的问题是我的文件没有发送到 API,它无法识别什么是文件,并且返回文件不存在错误。

注意:问题已解决和工作代码如下

代码如下:

形式

<form id="uploadPhoto" action="<?php uploadStreamPhoto(); ?>" method="post" enctype="multipart/form-data">
    <input type="file" name="streamPhotoUpload" id="streamPhotoUpload" />
    <input type="submit" name="streamPhotoUploadSubmit" id="streamPhotoUploadSubmit" value="Upload" />
</form>

上传功能

function uploadStreamPhoto()
{
    if(isset($_POST['streamPhotoUploadSubmit']))
    {
        $apiHandler = new APIHandler();
        $result = $apiHandler->uploadStreamPhoto($_FILES['streamPhotoUpload']['tmp_name']);
        $json = json_decode($result);
        var_dump($json);
        //header('Location: '.BASE_URL.'stream-upload-preview');
    }
}

处理程序方法

public function uploadStreamPhoto($file)
{
    $result = $this->request(API_URL_ADD_PHOTO, array(
    'accessToken' => $this->accessToken,
    'file' => "@$file;filename=".time().".jpg",
    'photoName' => time(),
    'albumName' => 'Stream'
    )); 
    return $result;
}

卷曲请求方法

/**
* Creates a curl request with the information passed in post fields
*
* @access private
* @param string $url
* @param array $postFields
* @return string
**/
private function request($url, $postFields = array())
{
    $curl = curl_init();
    //Check the SSL Matches the host
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
    if($this->debug == true)
    {
        //Prevent curl from verifying the certificate
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    }
    //Set the URL to call
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    //Set the results to be returned
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //Set the curl request as a post
    curl_setopt($curl, CURLOPT_POST, 1); 
    //Set the post fields
    curl_setopt($curl, CURLOPT_POSTFIELDS, $postFields); 
    $result = curl_exec($curl);
    if($result === false)
    {
        $result = 'Curl error: '.curl_error($curl);
    }
    curl_close($curl);
    return $result;
}

我的 2 美分给那些在 PHP 5.5 发布后结束在这里的人。有两件事值得一提:

PHP 5.5 更改

在 PHP 5.5 中引入了一个新函数,它改变了文件上传过程。 RFC:curl-file-uploads对它的描述最好。因此,如果您使用的是 PHP 5.5 或更高版本,您可能应该尝试使用 curl_file_create() 而不是添加@/full/file/path作为文件字段值。

在 PHP 5.5 或更高版本中使用传统方法

如果您使用的是 PHP 5.5 或更高版本,则在使用旧的文件上传方式时可能会遇到问题。

首先是您必须使用CURLOPT_SAFE_UPLOAD选项并将其设置为 FALSE .

其次,让我花费数小时进行调试的事情是,您必须在设置CULROPT_POSTFIELDS之前执行此操作。如果使用curl_setopt_array()则应在CURLOPT_POSTFIELDS之前将CURLOPT_SAFE_UPLOAD添加到该数组中。如果您使用的是curl_setopt()则只需在之前设置CURLOPT_SAFE_UPLOAD即可。如果不这样做,将导致文件字段作为包含字符串的文本发送@/full/file/path而不是正确上传文件。

使用旧方法的示例,但即使使用较新版本也应该有效

<?php
$options = array(
  CURLOPT_URL => $url,
  CURLOPT_RETURNTRANSFER => TRUE,
  CURLOPT_SAFE_UPLOAD => FALSE,
  CURLOPT_POSTFIELDS => array(
    'text1' => 'test',
    'submit' => 'Send!',
    'file1' => '@' . realpath('images/a.jpg'),
    'file2' => '@' . realpath('images/b.jpg'),
  ),
);
$ch = curl_init();
// Needed for PHP > 5.5 to enable the old method of uploading file.
// Make sure to include this before CURLOPT_POSTFIELDS.
if (defined('CURLOPT_SAFE_UPLOAD')) {
  curl_setopt($ch, CURLOPT_SAFE_UPLOAD, FALSE);
}
curl_setopt_array($ch, $options);
$content = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

完整代码在这里

PHP 5.5 或更高版本应该像这样使用

$options = array(
  CURLOPT_URL => $url,
  CURLOPT_RETURNTRANSFER => TRUE,
  CURLOPT_POSTFIELDS => array(
    'text1' => 'test',
    'submit' => 'Send!',
    'file1' => curl_file_create(realpath('images/a.jpg')),
    'file2' => curl_file_create(realpath('images/b.jpg')),
  ),
);
$ch = curl_init();
curl_setopt_array($ch, $options);
$content = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

完整代码在这里

好的,我已经找到了问题所在,希望该解决方案将帮助很多不想改变代码方式以代替其他人的人。

cURL 没有检测到它应该将此表单作为多部分发送,因此它以默认编码发送帖子,这意味着另一端没有收到 $_FILES 变量。

要解决此问题,您需要将 postdata 作为数组提供,我正在为发送创建字符串,我已经删除了它并给CURLOPT_POSTFIELDS一个数组。

使用 cURL 直接从表单上传时,另一个重要的事情是将文件的信息与实际文件一起包含。

我的 API 调用处理程序现在按如下方式创建了数组:

public function uploadStreamPhoto($file)
{
    $result = $this->request(API_URL_ADD_PHOTO, array(
    'accessToken' => $this->accessToken,
    'file' => "@$file;filename=".time().".jpg",
    'photoName' => time(),
    'albumName' => 'Stream'
    )); 
    return $result;
}

请注意,$file变量是 $_FILES['tmp_name'] 然后,您还必须定义文件名。我将用解决方案更新问题。

function curl_grab_page($url,$data,$secure="false",$ref_url="",$login = "false",$proxy = "null",$proxystatus = "false")
            {
                if($login == 'true') {
                    $fp = fopen("cookie.txt", "w");
                    fclose($fp);
                }
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
                curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
                curl_setopt($ch, CURLOPT_TIMEOUT, 60);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
                if ($proxystatus == 'true') {
                    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
                    curl_setopt($ch, CURLOPT_PROXY, $proxy);
                }
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                if($secure=='true')
                {
                    curl_setopt($ch, CURLOPT_SSLVERSION,3);
                }
                curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Expect:' ) );

                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_REFERER, $ref_url);
                curl_setopt($ch, CURLOPT_HEADER, TRUE);
                curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
                curl_setopt($ch, CURLOPT_POST, TRUE);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                ob_start();
                return curl_exec ($ch); // execute the curl command
                curl_getinfo($ch);
                ob_end_clean();
                curl_close ($ch);
                unset($ch);
            }

根据您的需要使用此 curl 函数,因为我使用它在 POST 甚至文件中发送数据。

$data['FileName'] = '@'.$ProperPath;

正确路径 = c:/images/a.jpg

curl_grab_page("url", $data);

相关内容

  • 没有找到相关文章

最新更新