zeerd's blog     Article     Search     About     Tags     Pebble     Feed

闲来生雅趣,无事乐逍遥。对窗相望雪,一盏茶香飘。

利用VPS实现网页打包下载或邮寄

#Offline


我们在很多时候由于各种原因而无法访问一些google搜索到的网页,这里提供一种利用vps系统进行远程打包下载服务的方法。
主要是借用php的exec函数,调用wget获取页面文件、调用tar进行打包,然后提供下载链接或者直接发送到指定邮箱。

以基于lnmp的php为例。

由于lnmp里面的php默认是关闭exec函数的,所以首先需要开启:
vim /usr/local/php/etc/php.ini
在里面搜索“disable_func”,然后删除其中的exec并重启php服务。
/etc/init.d/php-fpm restart

完成之后,将下面的php页面放入www的路径中。lnmp下的默认路径为/home/wwwroot/default
我这里将其命名为get_web.php

<?php
function mail_attachment($to, $subject, $message, $from, $file) {
// $file should include path and filename
$filename = basename($file);
$file_size = filesize($file);
$content = chunk_split(base64_encode(file_get_contents($file)));
$uid = md5(uniqid(time()));
$from = str_replace(array("\\r", "\\n"), '', $from); // to prevent email injection
$header = "From: ".$from."\\r\\n"
."MIME-Version: 1.0\\r\\n"
."Content-Type: multipart/mixed; boundary=\\"".$uid."\\"\\r\\n\\r\\n"
."This is a multi-part message in MIME format.\\r\\n"
."--".$uid."\\r\\n"
."Content-type:text/plain; charset=iso-8859-1\\r\\n"
."Content-Transfer-Encoding: 7bit\\r\\n\\r\\n"
.$message."\\r\\n\\r\\n"
."--".$uid."\\r\\n"
."Content-Type: application/octet-stream; name=\\"".$filename."\\"\\r\\n"
."Content-Transfer-Encoding: base64\\r\\n"
."Content-Disposition: attachment; filename=\\"".$filename."\\"\\r\\n\\r\\n"
.$content."\\r\\n\\r\\n"
."--".$uid."--";
return mail($to, $subject, "", $header);
}
?>

<html>
<head>
<title>download web site</title>
</head>
<body>
<?php
$web_url = $_GET["url"];
$mailto = $_GET["mail"];
$work_dir = exec('pwd') . '/tar_web/';
$tgt_dir_sub = md5($web_url) .'_' . date("YmdHis");
$tgt_dir = '/tmp/' . $tgt_dir_sub;
$tgt_tar_name = $tgt_dir_sub . '.tar.gz';
$tgt_tar = $work_dir . $tgt_tar_name;
$cmd_mkdir = 'mkdir ' . $tgt_dir;
$cmd_wget = 'wget -k -p --directory-prefix=' . $tgt_dir . ' ' . $web_url;
$cmd_tar = 'tar czf ' . $tgt_tar . ' ' . $tgt_dir;
$cmd_clean = 'rm -rf ' . $tgt_dir;
#echo $cmd_mkdir . "<br>";
exec($cmd_mkdir);
#echo $cmd_wget . "<br>";
exec($cmd_wget);
#echo $cmd_tar . "<br>";
exec($cmd_tar);
#echo $cmd_clean . '<br>';
exec($cmd_clean);

$mail_len = strlen($mailto);
if($mail_len == 0){
echo $web_url . ' --> ' . '<a href="tar_web/' . $tgt_tar_name . '">download</a>';
}
else{
mail_attachment($mailto, "download web site", $web_url, "root@your_host", $tgt_tar);
}
echo '<p>Done!</p>';
?>
</body>
</html>


使用时:
首先手动创建一个tar_web路径,在/home/wwwroot/default下面。
然后在浏览器中输入:
http://your_host/get_web.php?url=http://www.zeerd.com
或者
http://your_host/get_web.php?url=http://www.zeerd.com&mail=your_mail@gmail.com

注意:
初学者常犯的错误,使用root账号进行操作,结果www目录下的文件和文件夹的所有者都是root,导致php运行失败。
定期清理一下tar.gz文件。当然,也可以加一个后台页面用数据库管理,不过就目前来说功能已经足够使用了,暂时不考虑了。
代码中的mail_attachment函数来自:http://stackoverflow.com/a/4586659/2838940
另外,测试时发现一些网址只要出现在url中就会被重置,此时需要借助短地址等方式进行一下修饰。