php將數據下載到服務器壓縮後上傳至FTP

前面寫過一篇文章,使用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.養成好習慣,使用需要聲明開啓的方法的時候,使用結束記得關閉。減少不必要的開銷。

本來打算將壓縮單獨成一篇文章,發現時間有點晚,然後就寫一起去了。寫的比較簡單,不過使用起來也並不複雜。
這裏也想吐槽一下自己,太懶。做事也堅持不下了。積累了很多代碼也沒有寫博客。這個問題確實需要改一改。希望自己以後能及時總結,堅持技術積累。

發佈了42 篇原創文章 · 獲贊 38 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章