不推荐使用@filename API进行文件上载。请改用CURLFile类

时间:2015-01-16 00:57:01

标签: curl file-upload php-5.5 hp-haven hp-idol-ondemand

我是php的初学者,我正在使用HP的IDOL OnDemand api来练习从任何图像文件中提取文本。

我必须设置一个curl连接并执行api请求但是当我尝试使用@方法发布文件时,在PHP 5.5中它已被弃用并建议我使用CURLFile。

我还挖掘了php手册,并提出了类似https://wiki.php.net/rfc/curl-file-upload

的内容

代码如下:

$url = 'https://api.idolondemand.com/1/api/sync/ocrdocument/v1';

$output_dir = 'uploads/';
if(isset($_FILES["file"])){

$filename = md5(date('Y-m-d H:i:s:u')).$_FILES["file"]["name"];

move_uploaded_file($_FILES["file"]["tmp_name"],$output_dir.$filename);

$filePath = realpath($output_dir.$filename);
$post = array(
    'apikey' => 'apikey-goes-here',
    'mode' => 'document_photo',
    'file' => '@'.$filePath
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result = curl_exec($ch);
curl_close($ch);
echo $result;

unlink($filePath);

如果有任何重写代码并告诉我如何使用Curlfile,我将不胜感激。

谢谢,

2 个答案:

答案 0 :(得分:11)

我认为这就像更改'@'.$filePath而使用CurlFile一样简单。

$post = array('apikey' => 'key', 'mode' => 'document_photo', 'file' => new CurlFile($filePath));

以上对我有用。

注意:我为HP工作。

答案 1 :(得分:1)

由于时间压力,我在集成第三方API时做了快速的解决方法。你可以在下面找到代码。

$ url:要发布的域和页面;例如http://www.snyggamallar.se/en/ $ params:array [key] = value format,就像你在$ post中一样。

警告:任何以@开头的值都将被视为文件,这当然是一种限制。它不会导致我的任何问题,但请在您的代码中考虑它。

static function httpPost($url, $params){
    foreach($params as $k=>$p){
        if (substr($p, 0, 1) == "@") { // Ugly
            $ps[$k] = getCurlFile($p);
        } else {
            $ps[$k] = utf8_decode($p);
        }
    }

    $ch = curl_init($url);
    curl_setopt ($ch, CURLOPT_POST, true);
    curl_setopt ($ch, CURLOPT_POSTFIELDS, $ps);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

    $res = curl_exec($ch);
    return $res;
}

static function getCurlFile($filename)
{
    if (class_exists('CURLFile')) {
        return new CURLFile(substr($filename, 1));
    }
    return $filename;
}