首页 > 代码库 > php批量下载图片

php批量下载图片

  某论坛上有个爆照帖,帖子都顶到一千多楼了。为了满足窥私欲,故需要设计一批量下载指定用户名图的程序。

  之前的想法是直接用js实现,查了下说是用fso可以实现,其实从来没用过,看了下应该是对文件的操作,我估计可能不行。用js可以提取出下载的url,然后再在服务端进行下载。而提取url可以采取ajax轮询的操作,对n页进行ajax轮询,返回网页源码,新建一个div标签,将源码作为div标签的innerHTML内容插入,接下去就是dom的操作了~


 

服务端图片下载php代码:

 1 <?php 2 function downloadFile($url, $savePath, $name = ‘‘) 3 { 4   if ($name == ‘‘) 5   { 6     $header = get_headers($url, 1); 7     // 如果链接进行过跳转则匹配 location 之后的链接中的文件名 8     if (isset($header[‘Location‘])) { 9       $name = basename(str_replace(strstr($header[‘Content-Type‘][1], ‘?‘), ‘‘, $header[‘Location‘]));10       // 如果没有找到文件名则自动以当前时间为名称11       $name = ($name == ‘‘) ? time() . str_replace(‘/‘, ‘‘, strstr($header[‘Content-Type‘][1], ‘/‘)) : $name;12     } else {13       $name = basename(str_replace(strstr($header[‘Content-Type‘], ‘?‘), ‘‘, $url));14     }15   }16   return file_put_contents($savePath .‘/‘. $name, file_get_contents($url));17 }18 19 //保存图片路径20 $savePath = dirname(__FILE__)."\images";21 downloadFile($url, $savePath);22 // downloadFile($_POST[‘content‘], $savePath);23 // $a = dirname(__FILE__);24 // echo $a;25 ?>
View Code

 

  而客户端因为要进行ajax操作,所以写个同域的用户脚本就显得方便多了。对每页进行ajax操作后,回调函数中将回调的源码插入div中,然后对div进行dom操作,对用户名进行判断,如果符合,则对该层的img图片进行操作,提取url,post给后台,后台就可以下载了。详见注释

 

客户端js代码:

 1 // ==UserScript== 2 // @name        downloadpic 3 // @namespace   http://www.cnblogs.com/bigbigsunrise 4 // @description 批量下载指定用户图片 5 // @include     * 6 // @require     http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js 7 // @grant       GM_getValue 8 // @grant       GM_setValue 9 // @grant       GM_listValues10 // @grant       GM_deleteValue11 // @author      bigbigsunrise12 // ==/UserScript==13 14 $.noConflict();15 jQuery(document).ready(function($){16   // 跟帖的页码17   var firstindex = 1;18   var lastindex = 100;19   // url的前缀,自己定义20   var preurl = ‘...‘;21   for(var i = firstindex; i <= lastindex; i++) {22     jQuery.ajax ({23       type: ‘GET‘,24       url: preurl + i,25       dataType: ‘html‘,26       async: true,  // 异步27       success: function (msg) {28         var a = document.createElement(‘div‘);29         // 插入dom树,可以进行dom操作30         a.innerHTML = msg;31         // 以下的JQ操作其实可以大幅度优化,因为没有时间限制,所以暂时不优化了32         var b = $(a).find(‘.pi‘).children(‘.authi‘).children(‘.xw1‘);33         for(var i = 0; i < b.size(); i++) {34           // 用户名的判断,自己定义35           if(b.eq(i).html() === ‘username‘) {36             var c = b.eq(i).parent().parent().parent().parent().find(‘.t_fsz‘).find(‘img‘);37             for(var j = 0; j < c.size(); j++) {38               // 获取url39               var src = http://www.mamicode.com/c.eq(j).attr(‘file‘);40               if(!src) continue;41               if(src.charAt(0) === ‘h‘)42                 download(src);43               else 44                 // 自己定义45                 download(‘http://.../‘ + src);46             }47           }48         }49       }50     });51   }52 });53 54 function download(src) {55   $.ajax({56     type: ‘POST‘,57     url: ‘http://127.0.0.1/download/index.php‘,58     // dataType: ‘‘,59     async: false,60     // post的内容61     data: {content:src},62     success: function(msg) {63       // alert(msg);64     }65   });66 }

   这里说明下,js代码的第二个ajax其实是跨域了,控制台报错了不知道为什么还能继续执行。另外,如果知道了要下载的url,可以直接在后台定义数组,而邮件的发送则不能直接后台for循环操作,此处mark。

php批量下载图片