可兼容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 相关文章推荐
discuz的php防止sql注入函数
Jan 17 PHP
给初学者的30条PHP最佳实践(荒野无灯)
Aug 02 PHP
深入php数据采集的详解
Jun 02 PHP
浅析Apache中RewriteCond规则参数的详细介绍
Jun 30 PHP
thinkphp学习笔记之多表查询
Jul 28 PHP
PHP制作万年历
Jan 07 PHP
php运行时动态创建函数的方法
Mar 16 PHP
使用PHP生成二维码的方法汇总
Jul 22 PHP
php的debug相关函数用法示例
Jul 11 PHP
PHP模糊查询的实现方法(推荐)
Sep 06 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
Sep 23 PHP
php 类中的常量、静态属性、非静态属性的区别
Apr 09 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与SQL注入攻击[二]
2007/04/17 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
PHP实现全角字符转为半角方法汇总
2015/07/09 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
javaScript中的this示例学习详解及工作原理
2014/01/13 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
javascript中typeof操作符和constucor属性检测
2015/02/26 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
react中的ajax封装实例详解
2017/10/17 Javascript
Vue header组件开发详解
2018/01/26 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
[02:41]2015国际邀请赛中国区预选赛观战指南
2015/05/20 DOTA
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
python字符串查找函数的用法详解
2019/07/08 Python
基于python的BP神经网络及异或实现过程解析
2019/09/30 Python
如何给Python代码进行加密
2020/01/10 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
如何整合JQuery和Prototype
2014/01/31 面试题
大学生实习自我鉴定
2013/12/11 职场文书
《有趣的发现》教学反思
2014/04/15 职场文书
爱心捐款感谢信
2015/01/20 职场文书
golang 生成对应的数据表struct定义操作
2021/04/28 Golang