前面寫過一篇文章,使用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.養成好習慣,使用需要聲明開啓的方法的時候,使用結束記得關閉。減少不必要的開銷。
本來打算將壓縮單獨成一篇文章,發現時間有點晚,然後就寫一起去了。寫的比較簡單,不過使用起來也並不複雜。
這裏也想吐槽一下自己,太懶。做事也堅持不下了。積累了很多代碼也沒有寫博客。這個問題確實需要改一改。希望自己以後能及時總結,堅持技術積累。