【PHP开发】远程文件(图片)下载
这一篇文章介绍的方法不算原创了,只是引用的别人的文章,加上自己的注释,因为接触php时间不长,所以尝试的东西比较多,自己加的注释也比较简单,php高手请略过。
我要用到远程下载图片,是在做微信公众平台开发中“微信墙”这个子任务时遇到的,该需求中需要显示用户的头像,对于一般订阅号来说,我们在服务端拿到用户发送的消息时,是无法获得用户的名字、头像路径等基本信息的,我想到的解决方法主要有二:
1. 自己建一个用户表,用来存储微信一般消息里包含的用户名(FromUserName)和该用户真实名字以及该用户fakeid的对应关系,,实验发现,用户的FromUserName是一个和用户、公众平台微信号有关的字符串,具体生成策略不清楚,同一个用户往不同公众号上发消息,FromUserName是不同的,而每一个用户则对应唯一的fakeid,根据用户的fakeid,可以拼出头像url的地址,在我们的服务端收到用户发送的消息的时候,检查本地用户表中是否存有该FromUserName用户的真实信息,如果有,直接保存该条消息,如果没有,则模拟登陆微信公众平台的后台,拉取最近的新消息列表,比对得知该用户的用户名和fakeid,对于服务号来说,微信提供了接口来获取用户头像,但对于普通订阅号,只能根据用户的fakeid来拿头像,而且,这个头像必须是已登录用户才能访问的,为了防止模拟登陆中session超时等一系列问题,我就在模拟登陆拉用户信息的时候,直接将他的头像下载到本地保存。
2. 另一种思路是,不在收到用户消息的时候触发模拟登陆微信号后台的操作,而是定时地去微信后台拉取数据,根据lastmsgid,将最新的消息存到本地数据库,当然存储用户信息的方式,和前文介绍的相同。
不管用哪一种思路(实际中我用的是第一种),我都需要远程下载用户头像,因为之前没有接触过php,这个需求的解决,就google来解决了,测试代码如下:
<?php
function download($url, $cookie="", $file="", $timeout=60) {
$file = empty($file) ? pathinfo($url, PATHINFO_BASENAME) : $file;
$dir = pathinfo($file, PATHINFO_DIRNAME);
!is_dir($dir) && @mkdir($dir,0755,true);
$url = str_replace(" ","%20",$url); if(function_exists('curl_init')) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
$temp = curl_exec($ch);
if(@file_put_contents($file, $temp) && !curl_error($ch)) {
return $file;
} else {
return false;
}
} else {
$opts = array(
"http"=>array(
"method"=>"GET",
"header"=>"",
"timeout"=>$timeout)
);
$context = stream_context_create($opts);
if(@copy($url, $file, $context)) {
//$http_response_header
return $file;
} else {
return false;
}
}
}
$url = 'http://www.google.com.hk/images/srpr/logo11w.png';
echo download($url, '', $_SERVER['DOCUMENT_ROOT'] . '/Public/google.png');
该函数的四个参数,分别是要下载头像的url,cookie串,保存到哪个目录下(本机的绝对路径,使用$_SERVER['DOCUMENT_ROOT']获取Web根目录在本机的位置),请求超时时间,该代码的逐行解释如下:
// 如果没有指定保存路径,则把url中的文件名作为保存后的文件名
$file = empty($file) ? pathinfo($url, PATHINFO_BASENAME) : $file;
// 如果没有指定保存路径,或指定了保存的文件名但没有目录,则使用当前目录'.',若指定了则使用指定目录
$dir = pathinfo($file, PATHINFO_DIRNAME);
// 如果该目录不存在,则递归(第三个参数)创建该目录,权限为755,windows中,权限这个参数是被忽略的
// php中在函数名前+@来抑制函数的错误输出
!is_dir($dir) && @mkdir($dir, 0755, true);
// 将url中的空格使用url编码来进行编码
$url = str_replace(" ","%20",$url);
如果启用了curl则执行以下代码,因为一般php都会开启curl,所以else里的代码我没有验证,在这里只说使用curl方法的,curl的方法在性能上要略优于file_get_contents:
// 初始化curl,指定目标url、超时时间、要求返回数据和cookie(a=111&b=222的形式)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
// 执行curl,拉取数据
$temp = curl_exec($ch);
// 将返回的数据写入文件,如果写入的字节数不为0且curl未发生错误,则返回文件路径或文件名
if(@file_put_contents($file, $temp) && !curl_error($ch)) {
return $file;
}
至此,下载操作完成,该方法来源:PHP代码实现远程下载文件到本地的函数。
【PHP开发】远程文件(图片)下载的更多相关文章
- Python/PHP 远程文件/图片 下载
php 实现远程图片下载并保存到本地 /* *功能:php完美实现下载远程图片保存到本地 *参数:文件url,保存文件目录,保存文件名称,使用的下载方式 *当保存文件名称为空时则使用远程文件原来的名称 ...
- Android图片下载以及缓存框架
实际开发中进行图片下载以及缓存的框架 介绍一下开发中常见图片加载框架的使用和对比一下优缺点. 1.Picasso 框架 在Android中开发,常需要从远程获取图片并显示在客户端,当然我们可以使用原生 ...
- Android开发 ---从互联网上下载文件,回调函数,图片压缩、倒转
Android开发 ---从互联网上下载文件,回调函数,图片压缩.倒转 效果图: 描述: 当点击“下载网络图像”按钮时,系统会将图二中的照片在互联网上找到,并显示在图像框中 注意:这个例子并没有将图 ...
- 下载远程(第三方服务器)文件、图片,保存到本地(服务器)的方法、保存抓取远程文件、图片 将图片的二进制字节字符串在HTML页面以图片形式输出 asp.net 文件 操作方法
下载远程(第三方服务器)文件.图片,保存到本地(服务器)的方法.保存抓取远程文件.图片 将一台服务器的文件.图片,保存(下载)到另外一台服务器进行保存的方法: 1 #region 图片下载 2 3 ...
- 【ARM-LInux开发】利用scp 远程上传下载文件/文件夹
利用scp 远程上传下载文件/文件夹 scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o s ...
- php下载远程文件方法~
直接上代码: getFile("http://easyread.ph.126.net/N8gDl6ayo5wLgKbgT21NZQ==/7917056565549478184.jpg&quo ...
- iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍
一.快速生成沙盒目录的路径 沙盒目录的各个文件夹功能 - Documents - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...
- 使用CURL下载远程文件保存到服务器
比如微信公众平台开发,下载用户的头像到服务器上: /** * 使用CURL获取远程文件保存到服务器 *@param $image=$oJSON->headimgurl; 获取到的微信返回的头像U ...
- iOS开发中文件的上传和下载功能的基本实现-备用
感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
SQL 横转竖 .竖专横 (转载) 普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...
随机推荐
- duilib入门简明教程 -- XML基础类(7) (转)
原文转自:http://www.cnblogs.com/Alberl/p/3343743.html 现在大家应该对XML描述界面不那么陌生了,那么我们做进一步介绍. 前面的教程我们写了很多代码,为的是 ...
- 【虚拟机】主机与VMware虚拟机通信(XP版)(转)
一.与主机共享ADSL链接/无线网络(虚拟机内可上网) 安装虚拟机后,在网络链接下除了本地链接外,会出现两个新的链接,分别是VMware Network Adapter VMnet1和VMware N ...
- react-transition-group v2 用法概述
官方文档地址:https://reactcommunity.org/react-transition-group/ 在react-transition-group v2中,暴露了三个组件: Trans ...
- scala之split()函数用法
split()函数: def split(arg0: String): Array[String] def split(arg0: String, arg1: Int): Array[String] ...
- First Bad Version - LeetCode
You are a product manager and currently leading a team to develop a new product. Unfortunately, the ...
- [java基础] 002 - 位运算符的详解和妙用
一:位运算符详解 位运算符主要用来对操作数二进制的位进行运算.按位运算表示按每个二进制位(bit)进行计算,其操作数和运算结果都是整型值. Java 语言中的位运算符分为位逻辑运算符和位移运算符两类, ...
- COFF - 中间文件格式解析
http://www.cnblogs.com/weikanzong/p/5296739.html
- 深入SQL SERVER 2000的内存管理机制
http://www.cnblogs.com/softj/articles/243591.html
- mysql日常运维与参数调优
日常运维 DBA运维工作 日常 导数据,数据修改,表结构变更 加权限,问题处理 其它 数据库选型部署,设计,监控,备份,优化等 日常运维工作: 导数据及注意事项 数据修改及注意事项 表结构变更及注意事 ...
- CSS 属性选择器的深入挖掘
CSS 属性选择器,可以通过已经存在的属性名或属性值匹配元素. 属性选择器是在 CSS2 中引入的并且在 CSS3 中得到了很好拓展.本文将会比较全面的介绍属性选择器,尽可能的去挖掘这个选择器在不同场 ...