【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 ...
随机推荐
- 对/proc和/sys的一些理解
一切皆文件,设备(文件)可以通过读写来操作:/proc procfs:/sys sysfs: 个人的理解(不知对不对,感觉有些片面)/proc是内存中有关系统进程的实时信息:/sys是有关系统内核以及 ...
- 【spring专题】spring简介
前景概要 对于现在的Java开发基本上可以说成是spring开发,spring全家桶可以说是把整个Java web安排的明明白白的.正因为使用的很多,所以作为一名开发者不应该仅仅是会使用spring, ...
- linux 通过MD5监控指定路径文件的变动
脚本须知: 1. 运行此脚本的用户必须是root,因为在某些文件所在路径普通用户没有访问权限 2. 源文件和其md5码只要有一方内容有改动,都会导致校验失败,所以校验码的保存就至关重要防止其他人修改, ...
- Python学习杂记_8_从程序外部传参的办法sys.argv
Python用 sys.argv[] 实现从程序外部传参 “外部”的含义,其实就是这些参数不是你在程序中定义的,而是在程序之外通过输入操作传递进来的.sys.argv 会返回一个元组,元组的首个元素即 ...
- IE/FF/Chrome下document.documentElement和document.body的 scrollHeight/scrollTop/clientHeight 以及判断滚动条是否已拉到页面最底部
DTD已声明 IE document.documentElement.scrollHeight 浏览器所有内容高度 ,document.body.scrollHeight 浏览器所有内容高度 docu ...
- Android关于版本更新下载安装之踩坑记录(针对7.0以上)
最近刚刚把古老的项目targetSdk版本升级到26,升级之前是19(非常非常古老了).那么升级后一些问题开始出现. Android 8.0 (Android O)为了针对一些流氓软件引导用户安装其他 ...
- JS-严格模式、非严格模式
2018年11月14日晚上,我在“深入理解javascript”书上第一次知道“严格模式”“非严格模式”这2个名词: “严格模式”使用指令:“use strict”: 这个指令我其实有经常看到,在其他 ...
- ByteBuffer的介绍
转摘 有一个问题需要明确:为什么要使用bytebuffer,它比byte比起来有什么优点? 很简单:为了提高IO的效率.怎样提高的,这个还得google一下. 记住几个标志的含义:position[0 ...
- winform Loading效果
做winform项目时,有可能用到异步耗时加载数据啥的,这个时候就需要我们封装一个正在加载的效果.下面是实现思路: 步骤一:把当前form界面使用句柄的方式截图出一个图片,这个图片会在下面用到,使用句 ...
- PHP 5.4 中经 htmlspecialchars 转义后的中文字符串为空的问题
PHP 5.4.3 环境中测试了一个在 PHP 5.2 环境下运行正常的程序,却发现本应正常提交一个中文字符串到数据库的代码却提交了一个空字符串,经过排查,该字符串在经 htmlspecialchar ...