可兼容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版)
Oct 09 PHP
php 文章采集正则代码
Dec 28 PHP
php上传文件中文文件名乱码的解决方法
Nov 01 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
Dec 25 PHP
PHP与SQL语句常用大全
Dec 10 PHP
根据key删除数组中指定的元素实现方法
Mar 02 PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 PHP
PHP实现的文件上传类与用法详解
Jul 05 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
Sep 29 PHP
PHP实现上传图片到数据库并显示输出的方法
May 31 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 PHP
php实现JWT验证的实例教程
Nov 26 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使用crypt()函数进行加密
2017/06/08 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
2013/07/01 Javascript
jQuery中RadioButtonList的功能及用法实例介绍
2013/08/23 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
JavaScript适配器模式详解
2017/10/19 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
[01:10]DOTA2亚洲邀请赛 征战号角响彻全场
2015/01/06 DOTA
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
Python完全新手教程
2007/02/08 Python
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
Python 存取npy格式数据实例
2020/07/01 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
美国家居装饰和豪华家具购物网站:One Kings Lane
2018/12/24 全球购物
教师节促销方案
2014/03/22 职场文书
股权投资协议书
2016/03/23 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL
Java后台生成图片的完整步骤
2021/08/04 Java/Android
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技