php模拟input 的file上传文件

遇到一个需求是要把前端的上传文件通过php拿到然后再上传给接口,因为不能浏览器不能跨域上传拿到返回值,所以只能用前端上传,然后php拿到文件再上传一次。之前在网上找到curl方式不能上传二进制文件流,失败告终,代码如下:

上传函数:    

function curl_upload_file($url,$filename,$path,$type,$d){  
        if (class_exists('\CURLFile')) {  
            $data['file'] = new \CURLFile(realpath($path),$type,$filename);  
        } else {  
            $data['file'] = '@'.realpath($path).";type=“.$type.”;filename=".$filename;  
        }

        $ch = curl_init();  
        curl_setopt($ch, CURLOPT_URL, $curl);  
        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);  
        return $return_data;  
    }

函数使用:

$file = $_FILES['file'];

$data = $this->curl_upload_file($url, $file['name'], $file['tmp_name'], $file['type'],$request);

 

失败告终。

 

之后又在网上找到了二进制文件流的方式来模拟上传,终于成功,特写上完整代码

 

public function batchUpload(){

        ini_set('upload_max_filesize', '10M');  
        ini_set('post_max_size', '10M');  
        ini_set('memory_limit', '128M'); 
        $request = array();
        $request['type'] = $req->getParameter('type','1');
        $request['userToken'] = $this->userToken;
        $request['apiKey'] = $this->apiKey;
        $url ="http:www.test.com/comdata/importExcelSuit?";
        $result = array();
        $result['success'] = 1;

        $allowtype = array("xlsx", "xls");
        $file = $_FILES['file'];
        $aryStr = explode(".", $file['name']);
        $allowsize = 10485760;
        if (!in_array(strtolower($aryStr[count($aryStr)-1]), $allowtype)) {
            $result['success'] = -1;
            $result['msg'] = "请上传excel文件!";

        }
   
        if ($file['error'] != 0) {  
            $result['success'] = -1;  
            $result['msg'] = '上传出错';  
        }

        if ($file['size'] > $allowsize) {
            $result['success'] = -1;  
            $result['msg'] = '请上传文件大小小于10M'; 
        } 

        if($result['success']!=-1){
            
            $fileurl = $url .'?'. http_build_query($request);
            $data = base::sendStreamFile($fileurl,$file['tmp_name']);
            $result['data'] = json_decode($data,true);
            if($result['data']['statuscode'] != 1){
                $result['success'] = -1;
                $result['msg'] =  $result['data']['dataInfo'];
            }else{

                $result['success'] = 1;
            }
            
        }

        echo json_encode($result);
     
    }

 上传函数为

    static function sendStreamFile($url,$file)  
    {  
        if (empty($url) || empty($file))  
        {  
            return false;  
        }  
        $opts = array(  
                'http' => array(  
                        'method' => 'POST',  
                        'header' => 'content-type:application/x-www-form-urlencoded',  
                        'content' => $file  
                )  
        );  
        $context = stream_context_create($opts);  
        $response = file_get_contents($url, false, $context);  
        return $response;  
          
    }  

 

所有上传函数都是从网上down下来,感谢各位前辈的无私分享,因为来源比较杂,无法标明出处,我只是代码的搬运工。

转载于:https://my.oschina.net/u/2366458/blog/1491167

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值