可兼容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中常用编辑器推荐
Jan 02 PHP
THINKPHP+JS实现缩放图片式截图的实现
Mar 07 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
Nov 01 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
Oct 13 PHP
PHP对象Object的概念 介绍
Jun 14 PHP
php5.3提示Function ereg() is deprecated Error问题解决方法
Nov 12 PHP
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
Oct 10 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 PHP
Laravel 验证码认证学习记录小结
Dec 20 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
Mar 03 PHP
通过实例解析PHP数据类型转换方法
Jul 11 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使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
2017/02/04 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
javascript 一段左右两边随屏滚动的代码
2009/06/18 Javascript
在javascript中对于DOM的加强
2013/04/11 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
JavaScript小技巧整理篇(非常全)
2016/01/26 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
2019/04/29 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
对python 矩阵转置transpose的实例讲解
2018/04/17 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
String s = new String(“xyz”);创建了几个String Object?
2015/08/05 面试题
大学生毕业自我评价范文分享
2013/11/11 职场文书
幼师求职自荐信范文
2014/01/26 职场文书
护士自我鉴定怎么写
2014/02/07 职场文书
财务简历的自我评价
2014/03/05 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
个人先进材料范文
2014/12/30 职场文书
工程部主管岗位职责
2015/02/12 职场文书
退伍军人感言
2015/08/01 职场文书
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript