可兼容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 相关文章推荐
web方式ftp
Oct 09 PHP
php addslashes 函数详细分析说明
Jun 23 PHP
PHP Socket 编程
Apr 09 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
Feb 05 PHP
解析CI的AJAX分页 另类实现方法
Jun 27 PHP
php常用字符串比较函数实例汇总
Nov 24 PHP
thinkphp autoload 命名空间自定义 namespace
Jul 17 PHP
Yii2 GridView实现列表页直接修改数据的方法
May 16 PHP
CI框架入门之MVC简单示例
Nov 21 PHP
php安装dblib扩展,连接mssql的具体步骤
Mar 02 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 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
thinkphp的c方法使用示例
2014/02/24 PHP
php实现水仙花数的4个示例分享
2014/04/08 PHP
smarty中post用法实例
2014/11/28 PHP
php检查字符串中是否包含7位GSM字符的方法
2015/03/17 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
这样回答继承可能面试官更满意
2019/12/10 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
python运行其他程序的实现方法
2017/07/14 Python
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
简单了解python模块概念
2018/01/11 Python
python利用socketserver实现并发套接字功能
2018/01/26 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
详解Anaconda 的安装教程
2020/09/23 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
简历里的自我评价
2014/01/31 职场文书
创业培训计划书
2014/05/03 职场文书
活动总结报告格式
2014/05/09 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
优秀教师推荐材料
2014/12/16 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书