博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php模拟input 的file上传文件
阅读量:6200 次
发布时间:2019-06-21

本文共 2446 字,大约阅读时间需要 8 分钟。

hot3.png

遇到一个需求是要把前端的上传文件通过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

你可能感兴趣的文章
Android应用程序消息处理机制(Looper、Handler)分析(4)
查看>>
C++ 类成员的构造和析构顺序
查看>>
将String转化成Stream,将Stream转换成String
查看>>
java路径Java开发中获得非Web项目的当前项目路径
查看>>
Google API设计指南-资源名称
查看>>
最全React技术栈技术资料汇总(收藏)
查看>>
【工具使用系列】关于 MATLAB 遗传算法与直接搜索工具箱,你需要知道的事
查看>>
flex 学习笔记 stage
查看>>
Kali-linux Arpspoof工具
查看>>
java中三个类别加载器的关系以及各自加载的类的范围
查看>>
PDF文档页面如何重新排版?
查看>>
基于http协议使用protobuf进行前后端交互
查看>>
python3 + Django + uwsgi + nginx 配置部署笔记
查看>>
UML设计一个电影票务销售系统(四)
查看>>
如何给VEEAM 7 分配角色权限
查看>>
AlphaGo Zero用它来调参?【高斯过程】到底有何过人之处?
查看>>
《Redis官方教程》Redis集群规范(二)
查看>>
MacOS必备软件
查看>>
卸载金蝶kis记账王的方法
查看>>
centos中系统启动故障排除
查看>>