PHP使用curl上传文件到远程服务器接口

该篇已同步发表于个人博客 https://qiucode.cn/article/94

当然你的php.ini开启了curl扩展功能

1、文件上传

  /**
     * 以文件上传  第二种方法
     */
    public function upload(){
        $result = array('code' => 0, 'message' => 'ok');
        ini_set('upload_max_filesize', '20M');
        ini_set('post_max_size', '20M');
        ini_set('memory_limit', '128M');

        $url="http://xx.xx.xx.xx/api/file/upload";  //远程接口地址

        $file = $_FILES['file'];

        if ($file['error'] != 0) {
            $result['code'] = 40001;
            $result['message'] = '上传出错';
            $this->error();  //使用Thinkphp5.1内置controller方法
        } else {
            $filename = $file['name'];
            $tmpfile = $file['tmp_name'];
            $filetype = $file['type'];
            $data = self::upload_file($url, $filename, $tmpfile, $filetype);

            $data = json_decode($data,true);
            $this->success(); 使用Thinkphp5.1内置controller方法
            die;
        }
    }

 /**
  * curl上传文件
  * 
  * @param unknown $url
  * @param unknown $filename
  * @param unknown $path
  * @param unknown $type
 */
 protected function upload_file($url,$filename,$path,$type){
        //php 5.5以上的用法
    if (class_exists('\CURLFile')) {
       $data = array('file' => new \CURLFile(realpath($path),$type,$filename));
    } else {
       $data = array(
           'file'=>'@'.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);
     $return_data = curl_exec($ch);
     curl_close($ch);
     echo $return_data;
    }

2、文件接收端(不限定于PHP)

 /**
   * 接收文件
  */
public function upload(){
    Log::info('--------------$_FILES--------------------');
    Log::info($_FILES);
    if( $_FILES){
        $filename = $_FILES['file']['name'];
        $tmpname = $_FILES['file']['tmp_name'];
        if(move_uploaded_file($tmpname,  $_SERVER['DOCUMENT_ROOT']."/excel-file/" .$filename)){
            echo json_encode('上传成功');
        }else{
            $data = json_encode($_FILES);
            echo $data;
        }
    }   
 }

3、以下是以二进制文件上传偶尔会失败,故而不推荐使用,在此记录下!

 /**
  * 以二进制文件上传
  */
 public function upload_stream(){

     $url="http://xx.xx.xx.xx/api/file/upload";  //上传远程接口地址
     $info = $_FILES['file'];
     $fp = fopen($info['tmp_name'], 'r');
     $filebinary = fread($fp, filesize($info['tmp_name']));
     fclose($fp);

     $opts = array(
         'http' => array(
             'method' => 'POST',
             'header' => 'content-type:application/x-www-form-urlencoded',
             'context' =>  $filebinary 
         )
     );

     $context = stream_context_create($opts);
     $response = file_get_contents($url, false, $context); //就是这个方法  偶尔会失败哦!
     $ret = json_decode($response, true);
     return $ret['success'];

 }

//以下服务部署于服务端(不限定于PHP)
 /**
  * 接收二进制流文件
 */
public function upload_stream(){

    $streamData = isset($GLOBALS['HTTP_RAW_POST_DATA']) ?                                          $GLOBALS['HTTP_RAW_POST_DATA'] : '';

    $receiveFile =  $_SERVER['DOCUMENT_ROOT']."/excel-file/receiv.xlsx";

    if(empty($streamData)){
        $streamData = file_get_contents('php://input');
    }

    if($streamData!=''){
        $ret = file_put_contents($receiveFile, $streamData, true);
    }else{
        $ret = false;
    }

    return $ret;
}

  • 2
    点赞
  • 5
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甄齐才

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值