zoukankan      html  css  js  c++  java
  • 【转载】兼容php5,php7的cURL文件上传示例

    转载来自:

     http://www.huanlinna.com/2016/06/25/coding/php5-php7-upload-demo-via-curl.html

     https://segmentfault.com/a/1190000000725185

    index.html

    <html>
    <head>
        <title>上传示例</title>
    </head>
    <body>
        <div>下面上传文件到中间脚本:</div>
        <br />
        <form action="upload.php" method="post" enctype="multipart/form-data">
            选择文件:
            <input type="file" name="file" />
            <input type="submit" value="上传" />
        </form>
    </body>
    </html>

    upload.php

    <?php
    /**
     * 接收通过浏览器上传的文件
     *
     * @author Straiway<straiway@qq.com>
     * @site   http://straiway.sinaapp.com
     */
    if (empty($_FILES['file'])) {
        exit('没有上传指定名称的文件');
    }
     
    // 先保存到本地,再上传
    $file      = $_FILES['file'];
    $file_name = __DIR__ . "/{$file['name']}";
    move_uploaded_file($_FILES['file']['tmp_name'], $file_name);
     
    // 本地测试时,可能需要更改下面的URL
    $ch = curl_init('http://localhost/test/upload_via_curl.php');
     
    // 从php5.5开始,反对使用"@"前缀方式上传,可以使用CURLFile替代;
    // 据说php5.6开始移除了"@"前缀上传的方式
    if (class_exists('CURLFile')) {
        $file = new CURLFile($file_name);
     
        // 禁用"@"上传方法,这样就可以安全的传输"@"开头的参数值
        curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
    } else {
        $file = "@{$file_name}";
    }
     
    // 从php5.2开始,要上传文件,必须给CURLOPT_POSTFIELDS传递数组,而不是字符串。
    // 也只有传递数组,http头部的"Content-Type"才会设置成"multipart/form-data"
    curl_setopt($ch, CURLOPT_POSTFIELDS, array('file_via_curl' => $file));
     
    // 将传输结果作为curl_exec的返回值,而不是直接输出
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     
    $result = curl_exec($ch);
    $error  = curl_error($ch);
     
    if ($result) {
        $result_array = json_decode($result, true);
        if ($result_array) {
            if ($result_array['status']) {
                exit("上传成功!curl返回图片地址:{$result_array['data']['url']}<br /><img src='{$result_array['data']['url']}' />");
            } else {
                exit("curl上传失败!错误信息:{$result['info']}");
            }
        } else {
            exit("发生错误,curl返回结果:{$result}");
        }
    } else {
        exit('curl请求发生错误' . var_export($error, true));
    }

    upload_curl.php

    <?php
    /**
     * 接受通过curl上传的文件。
     *
     * @author Straiway<straiway@qq.com>
     * @site   http://straiway.sinaapp.com
     */
     
    if (empty($_FILES['file_via_curl'])) {
        $return = array('status' => 0, 'info' => '没有上传指定名称的文件');
    } else {
        // 保存文件
        $file = $_FILES['file_via_curl'];
     
        // 重命名文件,便于识别
        $base_name = explode('.', $file['name']);
        $base_name[0] .= '_upload_var_curl';
        $base_name = implode('.', $base_name);
        $file_name = __DIR__ . "/{$base_name}";
     
        if (move_uploaded_file($file['tmp_name'], $file_name)) {
            // 本地测试时,可能需要更改下面的URL
            $url    = "http://localhost/test/{$base_name}";
            $return = array('status' => 1, 'info' => '上传成功', 'data' => array('url' => $url));
        } else {
            $return = array('status' => 0, 'info' => '上传失败');
        }
    }
     
    exit(json_encode($return));
  • 相关阅读:
    知识体系总结
    计算机基础总结
    Redis总结
    Mysql总结
    JAVA基础总结
    有锁编程
    CAS
    读写自旋锁
    org.apache.log4j.Logger详解
    web.xml 中的listener、 filter、servlet 加载顺序及其详解
  • 原文地址:https://www.cnblogs.com/dcb3688/p/4608002.html
Copyright © 2011-2022 走看看