可兼容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 Http_Template_IT类库进行模板替换
Mar 19 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
Nov 12 PHP
php继承的一个应用
Sep 06 PHP
PHP中去掉字符串首尾空格的方法
May 19 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
Oct 16 PHP
IIS下PHP的三种配置方式对比
Nov 20 PHP
thinkphp中空模板与空模块的用法实例
Nov 26 PHP
PHP中文乱码解决方案
Mar 05 PHP
详谈php中 strtr 和 str_replace 的效率问题
May 14 PHP
php封装单文件上传到数据库(路径)
Oct 15 PHP
php nginx 实时输出的简单实现方法
Jan 21 PHP
PHP分页显示的方法分析【附PHP通用分页类】
May 10 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开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
PHP7原生MySQL数据库操作实现代码
2020/07/03 PHP
js传值 判断
2006/10/26 Javascript
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
老生常谈javascript的类型转换
2016/10/12 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
2017/02/15 Javascript
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
2019/08/20 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
微信小程序button标签open-type属性原理解析
2020/01/21 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
python正则表达式re模块详解
2014/06/25 Python
Python MD5加密实例详解
2017/08/02 Python
解析Python3中的Import
2019/10/13 Python
python随机生成库faker库api实例详解
2019/11/28 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
Numpy数组的广播机制的实现
2020/11/03 Python
python爬虫 requests-html的使用
2020/11/30 Python
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
大课间体育活动方案
2014/03/12 职场文书
2015财务年终工作总结范文
2015/05/22 职场文书
Python3的进程和线程你了解吗
2022/03/16 Python