可兼容php5与php7的cURL文件上传功能实例分析


Posted in PHP onMay 11, 2018

本文实例讲述了可兼容php5与php7的cURL文件上传功能。分享给大家供大家参考,具体如下:

为啥要写这个示例

最近修改一个项目,需要通过cURL上传文件。

记得之前做过类似实现的,于是翻出来之前的代码,使用的是“@”前缀方式。

但同样的方法现在不行了!后来发现,是版本兼容问题。

奔着开源分享的精神,同时避免自己遗忘,于是写了下面的示例程序。

示例程序

特别说明:

共3个文件,都放在web根目录的test目录下,同时保证该目录可写。上传的图片也会保存在该目录。

如果要将程序文件放在其他目录运行,必须更改php代码中的相关URL,否则示例可能无法运行。

<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>
<?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));
}
<?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));

参考资料

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
社区(php&amp;&amp;mysql)一
Oct 09 PHP
jQuery+php实现ajax文件即时上传的详解
Jun 17 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
Nov 26 PHP
php多文件上传实现代码
Feb 20 PHP
ThinkPHP3.1数据CURD操作快速入门
Jun 19 PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 PHP
PHP中使用虚代理实现延迟加载技术
Nov 05 PHP
PHP使用header()输出图片缓存实例
Dec 09 PHP
php常见的魔术方法详解
Dec 25 PHP
Laravel 5框架学习之Eloquent 关系
Apr 09 PHP
一个简单的php路由类
May 29 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
May 11 #PHP
PHP7基于curl实现的上传图片功能
May 11 #PHP
关于ThinkPHP中的异常处理详解
May 11 #PHP
PHP基于递归算法解决兔子生兔子问题
May 11 #PHP
PHP7如何开启Opcode打造强悍性能详解
May 11 #PHP
laravel项目利用twemproxy部署redis集群的完整步骤
May 11 #PHP
PHP实现搜索时记住状态的方法示例
May 11 #PHP
You might like
用php获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
2014/07/12 PHP
删除PHP数组中的重复元素的实现代码
2017/04/10 PHP
php 数据结构之链表队列
2017/10/17 PHP
js 动态选中下拉框
2009/11/26 Javascript
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
Javascript Throttle &amp; Debounce应用介绍
2013/03/19 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
JavaScript 闭包的使用场景
2020/09/17 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
Python安装第三方库的3种方法
2015/06/21 Python
django实现前后台交互实例
2017/08/07 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
pytorch 图像中的数据预处理和批标准化实例
2020/01/15 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
英文简历中的自荐信范文
2013/12/14 职场文书
业务员岗位职责范本
2013/12/15 职场文书
个人素质的自我评价分享
2013/12/16 职场文书
个人授权委托书模板
2014/09/14 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
sql查询结果列拼接成逗号分隔的字符串方法
2021/05/25 SQL Server