转载来自:

http://www.huanlinna.com/2016/06/25/coding/php5-php7-upload-demo-via-curl.html

https://segmentfault.com/a/1190000000725185

index.html

<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>

upload.php

<?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));
}

upload_curl.php

<?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));

【转载】兼容php5,php7的cURL文件上传示例的更多相关文章

  1. php curl文件上传兼容php5.0~5.6各版本

    PHP 5.0~5.6 各版本兼容的cURL文件上传 最近做的一个需求,使用PHP cURL上传文件.踩坑若干,整理如下. 不同版本PHP之间cURL的区别 PHP的cURL支持通过给CURL_POS ...

  2. curl文件上传有两种方式,一种是post_fileds,一种是infile

    curl文件上传有两种方式,一种是POSTFIELDS,一种是INFILE,POSTFIELDS传递@实际地址,INFILE传递文件流句柄! );curl_setopt($ch, CURLOPT_PO ...

  3. php curl文件上传

    <?php /** * 这是一个自动化部署的类, 非常简单,思想就是压缩,上传,然后解压覆盖,所以请小心使用. * @author liuchao <249757247@qq.com> ...

  4. [转]考虑 PHP 5.0~5.6 各版本兼容性的 cURL 文件上传

    FROM : https://segmentfault.com/a/1190000000725185 最近做的一个需求,要通过PHP调用cURL,以multipart/form-data格式上传文件. ...

  5. 兼容ie的jquery ajax文件上传

    Ajax文件上传插件很多,但兼容性各不一样,许多是对ie不兼容的,另外项目中是要求将网页内容嵌入到桌面端应用的,这样就不允许带flash的上传插件了,如:jquery uploadify...悲剧 对 ...

  6. PHP 5.0~5.6 各版本兼容性的 cURL 文件上传

    不同版本PHP之间cURL的区别 PHP的cURL支持通过给CURL_POSTFIELDS传递关联数组(而不是字符串)来生成multipart/form-data的POST请求. 传统上,PHP的cU ...

  7. 考虑 PHP 5.0~5.6 各版本兼容性的 cURL 文件上传

    最近做的一个需求,要通过PHP调用cURL,以multipart/form-data格式上传文件.踩坑若干,够一篇文章了. 重要警告 没事不要读PHP的官方中文文档!版本跟不上坑死你! 不同版本PHP ...

  8. (转载)JavaWeb学习总结(五十)——文件上传和下载

    源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...

  9. PHP+ExtJS 文件上传示例

    xtJS 4 有一个非常方便的文件上传组件,可以用来将文件上传到服务器.本文PHP教程UncleToo将介绍使用PHP和ExtJS实现文件上传功能. 首先,创建文件上传组件Ext.form.Panel ...

随机推荐

  1. Table 表单

    <style> table th { white-space: nowrap; } .chk { white-space: nowrap; } </style> <tab ...

  2. SQLServer-----Union,Union All的使用方法

    转载: http://blog.csdn.net/kiqinie/article/details/8132485 select a.Name from Material as a union sele ...

  3. vim(vi)常用操作及记忆方法

    vi(vim)可以说是linux中用得最多的工具了,不管你配置服务也好,写脚本也好,总会用到它.但是,vim作为一个“纯字符”模式下的工具,它的操作和WINDOWS中的文本编辑工具相比多少有些复杂.这 ...

  4. 【辅助远程连接,可穿防火墙、NAT】一次 TeamViewer 的安装与测试

    背景: 应课程老师要求帮助某化学老师维修机器(高性能电脑),并解决老师的若干问题,在解决硬件问题(上网问题:多个网络接口)之后,化学老师提出需要远程链接到该机器,试询问之前如何实现,化学老师推荐Tea ...

  5. Quartz.NET总结(四)Quartz 远程调度

    前面篇已经介绍了Quartz.NET的配置,使用和Cron表达式表达式的写法.基本上后台的定时任务的定时执行已经完成,并能正确的按照执行计划,执行相关的job . 然后,如果任务需要更新,停止某个任务 ...

  6. 关于struts2的过滤器和mybatis的插件的分析

    网上一搜,发现一篇写的非常棒的博文,就直接复制过来了,供以后复习使用. 前辈博文链接:共三篇: http://jimgreat.iteye.com/blog/1616671: http://jimgr ...

  7. 每天写点shell--命令行参数

    1.读取参数:位置参数变量是标准的数字: $0是程序名, $1是第一个参数, $2是第二个参数... #!/bin/bash # using one command line parameter fa ...

  8. js构造函数的方法与原型prototype

    把方法写在构造函数内的情况我们简称为函数内方法,把方法写在prototype属性上的情况我们简称为prototype上的方法 函数内的方法: 使用函数内的方法我们可以访问到函数内部的私有变量,如果我们 ...

  9. 谈谈混合 App Web 资源的打包与增量更新

    综述 移动 App 的运行环境具有带宽不稳定,流量收费,启动速度比较重要等特点,所以混合 App 如何加载 Web 资源并不是一个新问题.本文目的是总结出一种资源打包下载的思路和方案,并且提供一种打包 ...

  10. Linux下Python 文件内容替换脚本

    Linux下Python 文件替换脚本 import sys,os if len(sys.argv)<=4: old_text,new_text = sys.argv[1],sys.argv[2 ...