这一篇文章介绍的方法不算原创了,只是引用的别人的文章,加上自己的注释,因为接触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开发】远程文件(图片)下载的更多相关文章

  1. Python/PHP 远程文件/图片 下载

    php 实现远程图片下载并保存到本地 /* *功能:php完美实现下载远程图片保存到本地 *参数:文件url,保存文件目录,保存文件名称,使用的下载方式 *当保存文件名称为空时则使用远程文件原来的名称 ...

  2. Android图片下载以及缓存框架

    实际开发中进行图片下载以及缓存的框架 介绍一下开发中常见图片加载框架的使用和对比一下优缺点. 1.Picasso 框架 在Android中开发,常需要从远程获取图片并显示在客户端,当然我们可以使用原生 ...

  3. Android开发 ---从互联网上下载文件,回调函数,图片压缩、倒转

     Android开发 ---从互联网上下载文件,回调函数,图片压缩.倒转 效果图: 描述: 当点击“下载网络图像”按钮时,系统会将图二中的照片在互联网上找到,并显示在图像框中 注意:这个例子并没有将图 ...

  4. 下载远程(第三方服务器)文件、图片,保存到本地(服务器)的方法、保存抓取远程文件、图片 将图片的二进制字节字符串在HTML页面以图片形式输出 asp.net 文件 操作方法

    下载远程(第三方服务器)文件.图片,保存到本地(服务器)的方法.保存抓取远程文件.图片   将一台服务器的文件.图片,保存(下载)到另外一台服务器进行保存的方法: 1 #region 图片下载 2 3 ...

  5. 【ARM-LInux开发】利用scp 远程上传下载文件/文件夹

    利用scp 远程上传下载文件/文件夹 scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o s ...

  6. php下载远程文件方法~

    直接上代码: getFile("http://easyread.ph.126.net/N8gDl6ayo5wLgKbgT21NZQ==/7917056565549478184.jpg&quo ...

  7. iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍

    一.快速生成沙盒目录的路径 沙盒目录的各个文件夹功能 - Documents - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...

  8. 使用CURL下载远程文件保存到服务器

    比如微信公众平台开发,下载用户的头像到服务器上: /** * 使用CURL获取远程文件保存到服务器 *@param $image=$oJSON->headimgurl; 获取到的微信返回的头像U ...

  9. iOS开发中文件的上传和下载功能的基本实现-备用

    感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...

  10. SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型

    SQL 横转竖 .竖专横 (转载)   普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...

随机推荐

  1. HDU5006 Resistance(高斯消元)

    给你一个复杂的网路图,然后告诉你s,t,求s,t的等效电阻.方法是设s的电势为1,t的电势为0.然后对于其它的每个点x,满足的是sigma(ux-uy)/R(x,y)(即对每个与x相连的节点y,电势差 ...

  2. hdu 5475(打破固定思维OR线段树)

    An easy problem Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  3. Android开发 大坑Fragment

    是不是弄了半天你的Fragment老是Replace不了,我的原因是:弄成静 态的,然后要动态Replace,竟然不行,后来框个FragmentLayout,改成全动态添加和Replace,OK了.

  4. Unique Binary Search Trees II - LeetCode

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  5. asp.net上传文件夹权限配置以及权限配置的分析

    切记:一定要禁止给公共上传文件夹的权限设置为everyone,且为完全控制!除非你这个文件夹属于内部操作的,那这样做是允许,其余情况一律禁止! 基本的文件上传文件夹权限配置: 1.在需要配置上传的文件 ...

  6. Microsoft JET Database Engine(0x80004005)未指定错误的解决方法

    今天在给一台新的电脑安装IIS,安装成功,建立虚目录后,运行一个已经在别的机器上的正确的asp文件,就是不成功,提示:Microsoft JET Database Engine (0x80004005 ...

  7. git-ssh配置和使用

    https://segmentfault.com/a/1190000002645623 1.设置Git的user name和email:(如果是第一次的话) $ git config --global ...

  8. Cocos2d-x 3.0 屏幕触摸及消息分发机制

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  9. RPM命令使用

    RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写 •rpm的常用参数 i:安装应用程序(install) e:卸载应用程序(erase) vh:显示安装进度:( ...

  10. linux中nl用法

    linux 中nl 命令使用 nl :添加行号打印 -b:   指定行号指定的方式,主要有两种:    -b a : 表示不论是否为空行,都同样列出行号    -b t : 如果有空行,则不列出那一行 ...