关于批量下载ftp服务器的文件的方法

前言:批量下载网上有一堆,但是无奈都基本是对自己项目作用不大,研究了一下,分享和记录

1.首先要知道这个是从html页面发起的所以必须要加入这段话才行

//之前尝试用ajax和layer弹层来实现发现都会产生错误因此必须要用这个方法才行,前端的方法
location.href = 你想要访问的.php网页;
//后端的实现方法
<?php//这个class类是借鉴网友的,具体内部逻辑我也不太清晰,所以。。。。。。。class zipfile {    var $datasec = array ();    var $ctrl_dir = array ();    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";    var $old_offset = 0;

    function unix2_dostime($unixtime = 0){        $timearray = ($unixtime == 0) ? getdate () : getdate($unixtime);        if ($timearray [‘year‘] < 1980){            $timearray [‘year‘] = 1980;            $timearray [‘mon‘] = 1;            $timearray [‘mday‘] = 1;            $timearray [‘hours‘] = 0;            $timearray [‘minutes‘] = 0;            $timearray [‘seconds‘] = 0;        }        return (($timearray [‘year‘] - 1980) << 25) | ($timearray [‘mon‘] << 21) | ($timearray [‘mday‘] << 16) | ($timearray [‘hours‘] << 11) | ($timearray [‘minutes‘] << 5) | ($timearray [‘seconds‘] >> 1);    }    function add_file($data, $name, $time = 0){        $name = str_replace(‘\\‘, ‘/‘, $name);

        $dtime = dechex($this->unix2_dostime($time));        $hexdtime = ‘\x‘ . $dtime [6] . $dtime [7] . ‘\x‘ . $dtime [4] . $dtime [5] . ‘\x‘ . $dtime [2] . $dtime [3] . ‘\x‘ . $dtime [0] . $dtime [1];        eval(‘$hexdtime = "‘ . $hexdtime . ‘";‘);

        $fr = "\x50\x4b\x03\x04";        $fr .= "\x14\x00";        $fr .= "\x00\x00";        $fr .= "\x08\x00";        $fr .= $hexdtime;

        $unc_len = strlen($data);        $crc = crc32($data);        $zdata = gzcompress($data);        $zdata = substr(substr($zdata, 0, strlen($zdata)- 4), 2);        $c_len = strlen($zdata);        $fr .= pack(‘V‘, $crc);        $fr .= pack(‘V‘, $c_len);        $fr .= pack(‘V‘, $unc_len);        $fr .= pack(‘v‘, strlen($name));        $fr .= pack(‘v‘, 0);        $fr .= $name;

        $fr .= $zdata;        $fr .= pack(‘V‘, $crc);        $fr .= pack(‘V‘, $c_len);        $fr .= pack(‘V‘, $unc_len);

        $this->datasec [] = $fr;

        $cdrec = "\x50\x4b\x01\x02";        $cdrec .= "\x00\x00";        $cdrec .= "\x14\x00";        $cdrec .= "\x00\x00";        $cdrec .= "\x08\x00";        $cdrec .= $hexdtime;        $cdrec .= pack(‘V‘, $crc);        $cdrec .= pack(‘V‘, $c_len);        $cdrec .= pack(‘V‘, $unc_len);        $cdrec .= pack(‘v‘, strlen($name));        $cdrec .= pack(‘v‘, 0);        $cdrec .= pack(‘v‘, 0);        $cdrec .= pack(‘v‘, 0);        $cdrec .= pack(‘v‘, 0);        $cdrec .= pack(‘V‘, 32);

$cdrec .= pack(‘V‘, $this->old_offset);$this->old_offset += strlen($fr);

$cdrec .= $name;

$this->ctrl_dir[] = $cdrec;}function add_path($path, $l = 0){$d = @opendir($path);$l = $l > 0 ? $l : strlen($path) + 1;while($v = @readdir($d)){if($v == ‘.‘ || $v == ‘..‘){continue;}$v = $path . ‘/‘ . $v;if(is_dir($v)){$this->add_path($v, $l);} else {$this->add_file(file_get_contents($v), substr($v, $l));}        }    }function file(){$data = implode(‘‘, $this->datasec);$ctrldir = implode(‘‘, $this->ctrl_dir);return $data . $ctrldir . $this->eof_ctrl_dir . pack(‘v‘, sizeof($this->ctrl_dir)) . pack(‘v‘, sizeof($this->ctrl_dir)) . pack(‘V‘, strlen($ctrldir)) . pack(‘V‘, strlen($data)) . "\x00\x00";}

function add_files($files){foreach($files as $file){if (is_file($file)){$data = implode("", file($file));$this->add_file($data, $file);}        }    }function output($file){$fp = fopen($file, "w");fwrite($fp, $this->file ());fclose($fp);}}

$id_link = isset($_GET["id_link"]) ? $_GET["id_link"] : ""; //接收前端的get传值

//下面是数据库的操作,根据自己的连接数据库来具体操作$sql = "select t.`id_attachment`,t.`path`,t.`type`,t.`name`,t.`suffix`,t.`size` from t_attachment t where 1=1 and t.delete_flag=‘0‘ and t.`id_link`=:id_link;";$bindings = array(    [‘key‘ => ‘:id_link‘, ‘val‘ => $id_link, ‘type‘ => PDO::PARAM_STR]);//ftp连接登录信息$ftp_user = $ftp_details["user"];$ftp_pass = $ftp_details["pass"];$ftp_host = $ftp_details["host"];//下面是实例操作过程:$dfile = tempnam(‘/tmp‘, ‘tmp‘);//产生一个临时文件,用于缓存下载文件$zip = new zipfile();//----------------------$filename = ‘image‘.md5(‘trejlifd098498534‘.rand(1000,9999)).‘.‘.‘zip‘; //下载的默认文件名

//以下是需要下载的图片数组信息,将需要下载的图片信息转化为类似即可$image = array();for ($i=0;$i<count($results);$i++){$ftp_path = $results[$i]["path"]."/".$results[$i]["id_attachment"];$image[$i][‘image_src‘] = "ftp://{$ftp_user}:{$ftp_pass}@{$ftp_host}{$ftp_path}";$image[$i][‘image_name‘] = ‘img‘.$i.‘.‘.$results[$i]["suffix"];}

foreach($image as $v){$zip->add_file(file_get_contents($v[‘image_src‘]), $v[‘image_name‘]);// 添加打包的图片,第一个参数是图片内容,第二个参数是压缩包里面的显示的名称, 可包含路径    // 或是想打包整个目录 用 $zip->add_path($image_path);}//----------------------$zip->output($dfile);

// 下载文件ob_clean();header(‘Pragma: public‘);header(‘Last-Modified:‘.gmdate(‘D, d M Y H:i:s‘) . ‘GMT‘);header(‘Cache-Control:no-store, no-cache, must-revalidate‘);header(‘Cache-Control:pre-check=0, post-check=0, max-age=0‘);header(‘Content-Transfer-Encoding:binary‘);header(‘Content-Encoding:none‘);header(‘Content-type:multipart/form-data‘);header(‘Content-Disposition:attachment; filename="‘.$filename.‘"‘); //设置下载的默认文件名header(‘Content-length:‘. filesize($dfile));$fp = fopen($dfile, ‘r‘);while(connection_status() == 0 && $buf = @fread($fp, 8192)){echo $buf;}fclose($fp);@unlink($dfile);@flush();@ob_flush();exit();

以上方法你肯定不是拿来就能用的,需要自己去看看每一行的代码注释,修改下参数

原文地址:https://www.cnblogs.com/learningPHP-students2018/p/11008085.html

时间: 2024-07-28 19:21:56

关于批量下载ftp服务器的文件的方法的相关文章

linux批量下载FTP服务器文件

由于在vmwarem内做一个ORACLE测试环境,要从宿主机上复制ORACLE源安装文件.方法有很多,这次就想用3cdaemon把宿主机(windows)做TFTP服务器端,LINUX做客户端下载的方式实现.居然没那么容易. 1.用FTP登录,发现get只能下载单个文件,mget可以下载多个文件,但不能下载目录!没法下载几个G大小N个子目录的文件啊. 2.wget -r -nH --ftp-user=username --ftp-password=password 如:wget -r -nH f

C# 之 FTP服务器中文件上传与下载(三)

通过上一篇博客<C# 之 FTP服务器中文件上传与下载(二)>,我们已经实现将文件上传到我们创建的FTP服务器.今天我们就一起来看看怎么样实现从FTP服务器中下载我们所需要的文件.         我们想实现的效果是在页面上有一个超链接,超链接显示为我们想要下载的文件名.点击该文件名进入下载页面.首先我们在前台插入一个超链接,但是这个超链接为后台拼接的超链接. using System; using System.Collections.Generic; using System.Linq;

C# 之 FTP服务器中文件上传与下载(四)

        通过上一篇博客<C# 之 FTP服务器中文件上传与下载(三)>,我们已经实现将文件从我们创建的FTP服务器中下载到本地.今天就最后给大家讲解一下怎么对FTP中的文件进行重命名和删除操作. 首先在前台添加两个重命名和删除的按钮 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Defaul

windows7搭建ftp服务器与Java上传下载ftp服务器文件

1.Windows7搭建FTP服务器 1.1 首先新建一个用户,用于登录FTP进行操作,步骤:开始\控制面板\用户帐户和家庭安全\用户帐户\管理帐户\新建账户 1.2创建用户完成后我们开始添加IIS程序服务;进入控制面板\程序\打开或关闭Windows功能 然后点击打开在FTP服务器前面打勾,也就是把其子菜单的FTP服务和FTP扩展性打勾 1.3 创建FTP站点:进入控制面板\选择管理工具\信息服务管理器\添加站点 界面 下一步 下一步 1.4 查看FTP是否部署成功 完成FTP服务器的搭建.

Spring+Quartz实现定时从FTP服务器读取文件并存入Oracel数据库

package com.nstc.safe.action; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import 

ASP.NET批量下载服务器端指定目录文件

1 //遍历服务器指定文件夹下的所有文件 2 string path = "uploads/Image/"; 3 string serverPath = Server.MapPath(path); 4 5 //创建临时文件夹 6 string tempName = DateTime.Now.ToString("yyyyMMddHHMMss"); 7 string tempFolder = Path.Combine(serverPath, tempName); 8 D

springMVC下载FTP上的文件

springMVC下载FTP上的文件 今天没时间写.先上传 一个工具类 工具类 package com.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import org.apache.commons.lang3.StringUtils; import org.apache.commons.net.ftp.FTPClient; import org.apache.c

linux命令行模式下对FTP服务器进行文件上传下载

参考源:点击这里查看 1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码,待认证通过即可. 2. 下载文件 下载文件通常用get和mget这两条命令.a) get 格式:get [remote-file] [local-file]将文件从远端主机中传送至本地主机中.如要获取远程服务器上/usr/your/1.htm,则 ftp> get /usr/

FTP服务器实现文件传输

1.首先搭建ftp服务器,安装vsftpd #yum install -y vsftpd 2.查看vsftpd的目录: #rpm -ql vsftpd /etc/logrotate.d/vsftpd. vsftpd的日志文件 /etc/pam.d/vsftpd PAM认证文件 /etc/rc.d/init.d/vsftpd 启动脚本 /etc/vsftpd vsftpd的配置文件存放的目录 /etc/vsftpd/ftpusers 禁止使用vsftpd的用户列表文件 /etc/vsftpd/us