• [PHP] CURL文件上传


    一、说明

      本文主要简述CURL进行文件上传的一般操作,基于TP5框架;

      

    二、前端

      代码如下,需要填入对应的上传地址还有修改接收的参数名字(这里是 file):

     <form  action="上传地址"  method="post" enctype="multipart/form-data">
            <input type="file" name="file"> 
            <button type="submit">上传</button>
        </form>

    三、后端

      下面是基于TP5的上传处理,通过CURL上传到另外一台服务器上。

     1 <?php
     2 namespace appcontroller;
     3 
     4 use thinkController;
     5 
     6 //文件上传类
     7 class Upload extends Controller
     8 {
     9     protected $file_size = 20971520;//20M
    10     protected $file_type = ["png", "jpg", "jpeg", "gif"];
    11     protected $ret = ['code'=>0, 'msg'=>'', 'data'=>[]];
    12     private $uploadUrl = "http://xxx.com";//上传地址
    13 
    14     public function doit()
    15     {
    16         try{
    17             $verify = $file->validate(['size'=>$this->file_size,'ext'=>$this->file_type]);
    18             if (!$verify) {
    19                 throw new Exception('上传的文件大小超过20M, 或文件类型不正确');
    20             }
    21 
    22             $ext = pathinfo($file->getInfo('name'))['extension'];
    23             $tm = time();
    24             $mime = $file->getInfo('type');
    25 
    26             //表单请求参数
    27             $postData = [
    28                 'file' => new CURLFile(realpath($file->getPathname()), $mime, $fileName.".{$ext}"),
    29             ];
    30 
    31             $curlRes = $this->curlUploadFile($this->uploadUrl, $postData);
    32             $res = json_decode($curlRes, true);
    33 
    34             if($res['code'] == 200 && $res['data']['filePath'] != ""){
    35                 $this->ret['code'] = 200;
    36                 $this->ret['msg'] = '文件上传成功';
    37                 $this->ret['data'] = ['filePath' => $res['data']['filePath']];
    38             }else{
    39                 throw new Exception('上传文件失败: '.$res['msg'], 500);
    40             }
    41         }catch(Exception $ex){
    42             //异常处理
    43             $this->ret['code'] = 500;
    44             $this->ret['msg'] = $ex->getMessage();
    45         }
    46         return json($this->ret);//返回json
    47     }
    48
    50 
    51     //CURL文件上传
    52     private function curlUploadFile($url, $data)
    53     {
    54         $curl = curl_init();
    55         if (class_exists('CURLFile')) {
    56             curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true);
    57             //$data = array('file' => new CURLFile(realpath($path)));//>=5.5
    58         } else {
    59             if (defined('CURLOPT_SAFE_UPLOAD')) {
    60                 curl_setopt($curl, CURLOPT_SAFE_UPLOAD, false);
    61             }
    62             //$data = array('file' => '@' . realpath($path));//<=5.5
    63         }
    64         curl_setopt($curl, CURLOPT_URL, $url);
    65         curl_setopt($curl, CURLOPT_POST, 1 );
    66         curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    67         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    68         $result = curl_exec($curl);
    69         $error = curl_error($curl);
    70 
    71         curl_close($curl);
    72 
    73         return $result;
    74     }
    75 }
  • 相关阅读:
    Electron+Vue开发跨平台桌面应用
    html2canvas生成图片
    将某个DIV内容保存成图片,使用HTML2CANVAS截图方法(高清图并解决图片跨域问题)
    css3实现动画效果完整代码demo
    Vue + element从零打造一个H5页面可视化编辑器——pl-drag-template
    Vue.Draggable学习总结
    3d学习网
    vue router 报错: Uncaught (in promise) NavigationDuplicated {_name:""NavigationDuplicated"... 的解决方法
    网页适配 iPhoneX,就是这么简单
    关于for循环
  • 原文地址:https://www.cnblogs.com/reader/p/11444608.html
Copyright © 2020-2023  润新知