zoukankan      html  css  js  c++  java
  • PHP通过curl模拟POST上传文件,5.5之前和之后的区别

    首先先要着重提一下,只要是做和项目有关的开发,首先按把环境中各个服务的版本保持一致,否则出些莫名其妙的错我,让你百爪挠心却不知哪里的问题。这里就要说下curl_setopt($ch, CURLOPT_POSTFIELDS, $array) 这个方法上传,在5.5之前是可以用的,5.5的时候已经设置为deprecated,会有下面的提示,5.6的时候已经被删除。所以5.6版本的可能不能直接使用网上的一些代码。

    curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead

    因此这部分要根据版本判断下,修改为下面

    /**
     * CURL 上传文件
     * @param $url 处理上传文件的url
     * @param array $post_data post 传递的参数
     * @param array $file_fields 上传文件的参数,支持多个文件上传
     * @param int $timeout 请求超时时间
     * @return array|bool
     */
    function curl_upload($url, $post_data=array(), $file_fields=array(), $timeout=600) {
        $result = array('errno' => 0, 'errmsg' => '', 'result' => '');
        
        $ch = curl_init();
        //set various curl options first
    
        // set url to post to
        curl_setopt($ch, CURLOPT_URL, $url);
    
        // return into a variable rather than displaying it
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
        //set curl function timeout to $timeout
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        //curl_setopt($ch, CURLOPT_VERBOSE, true);
    
        //set method to post
        curl_setopt($ch, CURLOPT_POST, true);
    
        // disable Expect header
        // hack to make it working
        $headers = array("Expect: ");
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
        //generate post data
        $post_array = array();
        if (!is_array($post_data)) {
            $result['errno'] = 5;
            $result['errmsg'] = 'Params error.';
            return $result;
        }
        
        foreach ($post_data as $key => $value) {
            $post_array[$key] = $value;
        }
    
        // set multipart form data - file array field-value pairs
        if(version_compare(PHP_VERSION, '5.5.0') >= 0) {
            if (!empty($file_fields)) {
                foreach ($file_fields as $key => $value) {
                    if (strpos(PHP_OS, "WIN") !== false) {
                        $value = str_replace("/", "\", $value); // win hack
                    }
                    $file_fields[$key] = new CURLFile($value);
                }
            }
        } else {
            if (!empty($file_fields)) {
                foreach ($file_fields as $key => $value) {
                    if (strpos(PHP_OS, "WIN") !== false) {
                        $value = str_replace("/", "\", $value); // win hack
                    }
                    $file_fields[$key] = "@" . $value;
                }
            }
        }
    
        // set post data
        $result_post = array_merge($post_array, $file_fields);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $result_post);
        // print_r($result_post);
    
        //and finally send curl request
        $output = curl_exec($ch);
        $result['result'] = $output;
        
        if (curl_errno($ch)) {
            echo "Error Occured in Curl
    ";
            echo "Error number: " . curl_errno($ch) . "
    ";
            echo "Error message: " . curl_error($ch) . "
    ";
            return false;
        } else {
            return $result;
        }
        curl_close($ch);
    }
  • 相关阅读:
    mysql官网下载链接——绿色版&安装版
    eclipse中去掉警告提示
    java用servlet、cookie实现一个阅读记录
    eclipse中的错误解决——Servlet cannot be resolved to a type
    eclipse——jsp字体设置
    eclipse——添加Tomcat7.0服务器
    eclipse中的错误解决——The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
    eclipse——JavaEE插件
    OpenMP用法大全
    __new__ __init__区别
  • 原文地址:https://www.cnblogs.com/wayne173/p/6078205.html
Copyright © 2011-2022 走看看