您的位置:首页 > 编程语言 > PHP开发

php将数据下载到服务器压缩后上传至FTP

2016-12-04 23:03 260 查看
前面写过一篇文章,使用RESTful API以post+json的方式给服务器传数据。这种方式使用与数据量比较小的时候。当数据量过大,十几兆甚至几百兆的时候,会引发很多问题。

这篇文章主要通过文件的形式上传到FTP服务器。对方服务器再通过FTP下载的方式,获取我的数据。这种方式相比post+json相对要安全一些。而且经过zip压缩后,文件要小很多。传输的数据也大幅度减少。

直接上代码

public function actionZipandftp(){
$filename = time().'zuiniubideceshi2.csv';
$file = '../../testdownload/'.$filename;
$filedir = '../../testdownload/';
$data = 'woshishui,ni shi shui,this is a  test!,once again this is a test!,do not forget, this is a test';
function write($filename,$data,$file){

$fp = fopen($file, 'we'); //当文件不存在时创建文件。
if($fp){
flock($fp,LOCK_EX);//同一时间锁定文件,只能一个人操作
fwrite($fp,$data); //将数据写入创建的文件中。
flock($fp,LOCK_UN);//保存数据握进行解锁文件并保存
fclose($fp);
return true;
}else{
return false;
}
}

if(write($filename,$data,$file)){
$zip = new \ZipArchive; //这里使用的是php自带的zip压缩扩展
if ($zip->open($filedir.'test.zip',\ZipArchive::OVERWRITE) === TRUE) {
$zip->addFile($filedir.$filename,$filename);
// addFileToZip($filedir,$zip);
$zip->close();
}else{
echo '压缩出错了';
}

// 连接ftp服务器并上传
$conn_id = ftp_connect('192.168.84.20') or die('连接失败');
$login_result = ftp_login($conn_id, 'xiedj', '671.Xdj');

// 上传
if(ftp_put($conn_id, 'test.zip', $filedir.'test.zip', FTP_BINARY)) {
echo "Successfully uploaded $file\n";
} else {
echo "There was a problem while uploading $file\n";
}

// 退出
ftp_close($conn_id);
}
}


代码说明

前3条说明,十分重要,也是我爬过的坑。

1.控制器中有一个write方法。这里我爬过坑。刚开始我是一http下载的方法,通过浏览器下载后再上传。但是有个问题,代码下载没有结束就会执行后面的代码。导致上传的文件为空文件。而write方法是直接将数据保存到服务器的文件中。保存结束返回true后再执行后面的代码,保证的传递数据的完整性。

2.有一个地方需要重点注意。上传文件的方法ftp_put中有四个参数。第一个参数为ftp服务器地址。第二个参数为文件名。第三个参数为文件路径。第四个参数是上传方式,该方法有两种上传方式,FTP_ASCII和FTP_BINARY,前者会转换换行符,一般用于文本文件的传输。后者不会对文件做任何处理,一般用于压缩文件、图片等文件的传输。这个地方其他的教程可能会忽略,造成不必要麻烦。这里需要注意一下。

3.压缩文件的时候,也存在一个坑。网上好多实例都没有交代清楚。很容易就掉到坑中。实例化zip对象后。调用添加文件addFile()方法,有两个参数,第一个参数为文件名,第二个参数为文件路径。因为第二参数不是必须参数,好多教程又是直接复制粘贴的。所有调用addFile方法的时候,将带有路径的文件名当做第一个参数传进去。此时会压缩会带入很多目录,看起来非常不爽。(这里想吐槽一下,复制粘贴,验证没有的文章,不知道发出来有什么意义。而且网上经常有这样的例子,一篇文章的代码错了,后面百度到的一万篇代码都错的这个位置。太恶心人了…)

4.csv格式是一种以“,”为分割的数据文件。

5.养成好习惯,使用需要声明开启的方法的时候,使用结束记得关闭。减少不必要的开销。

本来打算将压缩单独成一篇文章,发现时间有点晚,然后就写一起去了。写的比较简单,不过使用起来也并不复杂。

这里也想吐槽一下自己,太懒。做事也坚持不下了。积累了很多代码也没有写博客。这个问题确实需要改一改。希望自己以后能及时总结,坚持技术积累。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php 文件压缩 上传 ftp zip