当前位置:Gxlcms > PHP教程 > 淘宝TFSPHP如何调用API?

淘宝TFSPHP如何调用API?

时间:2021-07-01 10:21:17 帮助过:11人阅读

如下,PHP 上传图片到淘宝TFS图片服务器,能返回元数据,但是图片预览乱码

$v){
                        $set_head[] = "$k:$v";
                    }
                    curl_setopt($ch, CURLOPT_HTTPHEADER, $set_head);
                }
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_TIMEOUT, 1);// 1s to timeout.
                $response = curl_exec($ch);
                if(curl_errno($ch)){
                    //error
                    return curl_error($ch);
                }
                $reslut = curl_getinfo($ch);
                print_r($reslut);
                curl_close($ch);
                $info = array();
                if($response){
                    $info = json_decode($response, true);
                }
                return $info;
            } else {
                throw new Exception('Do not support CURL function.');
            }
    }
    //*/
    //  
    function api_notice_increment($url, $data)
    {
        $ch = curl_init();        
        curl_setopt($ch, CURLOPT_HEADER,0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, 1);
//        $data = http_build_query($data);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        //curl_file_create
    //    $result =  curl_exec($ch);
        $lst['rst'] = curl_exec($ch);
        $lst['info'] = curl_getinfo($ch);
        curl_close($ch); 
    
        return $lst;
    //    return $result;
    }

     /**
         *  curl文件上传
         *  @var  struing  $r_file  上传文件的路劲和文件名  
         *     
         */
    /*     
    function upload_file($url,$r_file)
     {
        $file = array("fax_file"=>'@'.$r_file,'type'=>'image/jpeg');//文件路径,前面要加@,表明是文件上传.
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,$url);
        curl_setopt($curl,CURLOPT_POST,1);
        curl_setopt($curl,CURLOPT_POSTFIELDS,$file);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        $result = curl_exec($curl);  //$result 获取页面信息 
        curl_close($curl);
        echo $result ; //
输出 页面结果 }*/ function upload_file($url,$filename,$path,$type){ $data = array( 'pic'=>'@'.realpath($path).";type=".$type.";filename=".$filename ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true ); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_getinfo($ch); $return_data = curl_exec($ch); curl_close($ch); echo $return_data; } if ($_POST) { $url = '169.57.13.186:8080/v1/tfs?suffix=.jpg&simple_name=1'; // /* print_r($_FILES); exit; */ //$filename = $path."/232.jpg"; //upload tmp $tmpname = $_FILES['fname']['name']; $tmpfile = $_FILES['fname']['tmp_name']; $tmpType = $_FILES['fname']['type']; // echo $tmpType; upload_file($url,$tmpname,$tmpfile,$tmpType); /* $data = array( 'path'=>"@$path/232.jpg", 'name'=>'h' ); */ //'pic'=>'@/tmp/tmp.jpg', 'filename'=>'tmp' //$data = array('pic'=>"@$filename", 'filename'=>'tmp'); /* $data = array( 'uid' => 10086, 'pic' => '@$tmpfile'.';type='.$tmpType ); $info = api_notice_increment($url, $data); */ //$info = curl_post($url, $data); //$info = api_notice_increment($url, $data); //upload_file($url,$tmpfile); //print_r($info); exit; /* $file = 'H:\www\test\psuCARGLSPA-pola.jpg'; //要上传的文件 $src = upload_curl_pic($file); echo $src; */ } ?>

回复内容:

如下,PHP 上传图片到淘宝TFS图片服务器,能返回元数据,但是图片预览乱码

$v){
                        $set_head[] = "$k:$v";
                    }
                    curl_setopt($ch, CURLOPT_HTTPHEADER, $set_head);
                }
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_TIMEOUT, 1);// 1s to timeout.
                $response = curl_exec($ch);
                if(curl_errno($ch)){
                    //error
                    return curl_error($ch);
                }
                $reslut = curl_getinfo($ch);
                print_r($reslut);
                curl_close($ch);
                $info = array();
                if($response){
                    $info = json_decode($response, true);
                }
                return $info;
            } else {
                throw new Exception('Do not support CURL function.');
            }
    }
    //*/
    //  
    function api_notice_increment($url, $data)
    {
        $ch = curl_init();        
        curl_setopt($ch, CURLOPT_HEADER,0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, 1);
//        $data = http_build_query($data);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        //curl_file_create
    //    $result =  curl_exec($ch);
        $lst['rst'] = curl_exec($ch);
        $lst['info'] = curl_getinfo($ch);
        curl_close($ch); 
    
        return $lst;
    //    return $result;
    }

     /**
         *  curl文件上传
         *  @var  struing  $r_file  上传文件的路劲和文件名  
         *     
         */
    /*     
    function upload_file($url,$r_file)
     {
        $file = array("fax_file"=>'@'.$r_file,'type'=>'image/jpeg');//文件路径,前面要加@,表明是文件上传.
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,$url);
        curl_setopt($curl,CURLOPT_POST,1);
        curl_setopt($curl,CURLOPT_POSTFIELDS,$file);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        $result = curl_exec($curl);  //$result 获取页面信息 
        curl_close($curl);
        echo $result ; //
输出 页面结果 }*/ function upload_file($url,$filename,$path,$type){ $data = array( 'pic'=>'@'.realpath($path).";type=".$type.";filename=".$filename ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true ); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_getinfo($ch); $return_data = curl_exec($ch); curl_close($ch); echo $return_data; } if ($_POST) { $url = '169.57.13.186:8080/v1/tfs?suffix=.jpg&simple_name=1'; // /* print_r($_FILES); exit; */ //$filename = $path."/232.jpg"; //upload tmp $tmpname = $_FILES['fname']['name']; $tmpfile = $_FILES['fname']['tmp_name']; $tmpType = $_FILES['fname']['type']; // echo $tmpType; upload_file($url,$tmpname,$tmpfile,$tmpType); /* $data = array( 'path'=>"@$path/232.jpg", 'name'=>'h' ); */ //'pic'=>'@/tmp/tmp.jpg', 'filename'=>'tmp' //$data = array('pic'=>"@$filename", 'filename'=>'tmp'); /* $data = array( 'uid' => 10086, 'pic' => '@$tmpfile'.';type='.$tmpType ); $info = api_notice_increment($url, $data); */ //$info = curl_post($url, $data); //$info = api_notice_increment($url, $data); //upload_file($url,$tmpfile); //print_r($info); exit; /* $file = 'H:\www\test\psuCARGLSPA-pola.jpg'; //要上传的文件 $src = upload_curl_pic($file); echo $src; */ } ?>

TFS服务器是保存的你HTTP请求中, POST 的内容,所以你按上传文件的格式发请求,你最后记录下来的内容就是你POST上传时的请求体.

试试下面这样的.

';
    }else{
        echo $return_data;
    }
}
?>





效果演示:

如果要上传的文件是在本地, 而不是由表单提交上来的, 代码修改如下:

//要提交至TFS服务器的数据
    $data = file_get_contents($_FILES['fname']['tmp_name']);

改为

    //要上传的图片是本地的文件时,使用 `file_get_contents` 得到内容,然后上传.
    $data = file_get_content('X:\xxx.png');

=================我还是分隔线====================

根据楼主在评论中的补充,花了几分钟写一个PHP的class, 代码及测试用例如下:

API_URL = sprintf('%s/%s/%s', $host, $ver, $appkey);
    }

    private function Request($action='', $method='GET', $data=null){

        $ch = curl_init($this->API_URL . $action);

        //指定 HTTP 请求的 Method
        curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, $method);

        //设定CURL请求的超时时间(当你需要上传或者获取比较大的文件时,可以将超时时间设置的大一点,以防止文件没操作完成,但超过超时时间之后出现问题)
        curl_setopt($ch, CURLOPT_TIMEOUT, 120);//单位秒(此处设定为2分钟)

        if($data !== null){
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            //去除自带的这两个 HTTP请求头
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                    'Content-Type:', 'Accept:'
            ));
        }else{
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                    'Accept: '
            ));
        }

        //将得到的内容通过 curl_exec 返回, 而不是直接
输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //curl_exec 返回的内容不要包含HTTP响应头 curl_setopt($ch, CURLOPT_HEADER, false); $return_data = curl_exec($ch); curl_close($ch); return $return_data; } //返回保存后的文件名,如果保存失败, 则返回 FALSE public function SaveFile($data, $parameter=''){ $ret = $this->Request($parameter, 'POST', $data); $ret = json_decode($ret, TRUE); //解析 json 字符串失败, 或者返回的内容中没有 TFS_FILE_NAME, 则认为保存失败 if($ret === NULL || !isset($ret['TFS_FILE_NAME'])){ return FALSE; } return $ret['TFS_FILE_NAME']; } //返回更新后的文件名,如果更新失败, 则返回 FALSE //$filename 旧的文件名(即你要更新哪个文件的文件名) //$data 要更新的内容是什么 //$parameter 设置更新后的文件时访问所需要的参数 public function UpdateFile($filename, $data, $parameter=''){ $ret = $this->Request(sprintf('/%s%s', $filename, $parameter), 'PUT', $data); $ret = json_decode($ret, TRUE); //解析 json 字符串失败, 或者返回的内容中没有 TFS_FILE_NAME, 则认为保存失败 if($ret === NULL || !isset($ret['TFS_FILE_NAME'])){ return FALSE; } return $ret['TFS_FILE_NAME']; } //从TFS服务器上获取文件 public function ReadFile($filename){ return $this->Request(sprintf('/%s', $filename), 'GET'); } //从TFS服务器上删除文件 public function DeleteFile($filename){ $this->Request(sprintf('/%s', $filename), 'DELETE'); } } $tfs = new TFSClient( 'http://169.57.13.186:8080', //API主机地址 'v1',//版本 'tfs'//AppKey ); //测试代码, 自动生成要上传的文件 $tf1 = __DIR__ .'/test1.txt'; $tf2 = __DIR__ . '/test2.txt'; //写入文件内容 file_put_contents($tf1, 'HelloWorld!!!!!'); file_put_contents($tf2, 'HelloWorld, Again!!!!!' . time()); //保存文件至TFS上 //使用 .txt 的扩展名保存文件(suffix=.txt), 并且要求访问时必须带正确的后缀才可以访问存入的文件(simple_name=1) //第二个参数中的内容, 请根据 TFS RESTful API 中的说明并根据自己的需要做相应的修改, 此处只是根据你之前提供的代码做演示 $result = $tfs->SaveFile(file_get_contents($tf1), '?suffix=.txt&simple_name=1'); if($result === FALSE){ exit('文件保存失败!'); } $filename = $result; echo "上传成功后的文件名为: ", $filename, "\n"; //从TFS服务器上读取文件 $f = $tfs->ReadFile($filename); //将读取到的文件写入到本地 file_put_contents(__DIR__ . '/ntest1.txt', $f); //更新文件至TFS上 $result = $tfs->UpdateFile($filename, file_get_contents($tf2)); if($result === FALSE){ exit('更新文件失败!'); } $filename = $result; echo "更新后的文件名为: ", $filename, "\n"; //从TFS服务器上读取文件 $f = $tfs->ReadFile($filename); //将读取到的文件写入到本地 file_put_contents(__DIR__ . '/ntest2.txt', $f); //输出上传/下载下来的文件的MD5值 $files = array('test1.txt', 'ntest1.txt', 'test2.txt', 'ntest2.txt'); foreach($files as $f){ echo __DIR__ . '/' . $f, "\t", md5(file_get_contents(__DIR__ . '/'. $f)), "\n"; } //删除更新后的文件 $tfs->DeleteFile($filename); //尝试读取刚才删除的文件 $f = $tfs->ReadFile($filename); //会输出 404, 因为文件被删除了, 不存在了, 根据 TFS RESTful API 文档中的定义, 服务器返回 404 Not Found echo $f;

运行效果如(运行环境: PHP 5.6.9 (cli) (built: May 13 2015 19:28:50)):

PS: 本人的专职工种是写javascript的, 非职业 PHP 选手, 上面的代码请轻喷, 谢谢合作.

不知道你在哪儿复制的代码,里面两个没用到的函数,主要问题是在:

php$data = array(
            'pic'=>'@'.realpath($path).";type=".$type.";filename=".$filename
        );

只需要@+服务器上的图片路径就可以了。
整理修改了下,已测:

php'@'.$tmpfile
    );
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_getinfo($ch);
    $return_data = curl_exec($ch);
    curl_close($ch);
    echo $return_data;
    exit;
}
?>






乱码在于你图片中包含了http 响应头信息,把响应头信息去掉就可以了

curl_setopt($ch, CURLOPT_HEADER, false);

人气教程排行