用php進行url的解碼

最近閒來無聊想寫個微信小程序,在小程序內看保存在羣暉NAS裏的PDF文件,相關pdf的文件存在mysql裏.這就需要先用php從NAS搭建的ftp上下載文件到電腦本地,再通過接口傳給微信小程序,進行閱讀.
之後發現ftp提供的下載地址如:
ftp://xxx.xxx.xxx.xxx/DISK/PDF/%C4%A7%B6%BC%D2%B9%BE%B0.pdf
這裏的%C4%A7%B6%BC%D2%B9%BE%B0轉爲中文是[魔都夜景]
在小程序端讀取mysql獲取到的是pdf的中文名,拼接後是中文的下載地址.如ftp://xxx.xxx.xxx.xxx/DISK/PDF/魔都夜景.pdf
而這個中文地址無法通過crul下載,會提示該文件不存在.
所以需要將%C4%A7%B6%BC%D2%B9%BE%B0轉爲中文[魔都夜景]拼接後纔可順利下載.
這裏做個筆記

public function getFileFromFTP($host, $user, $pass, $path, $fileSavePath)
    {
        $curlobj = curl_init();//初始化
        $path_split = explode("/", $path);
        curl_setopt($curlobj, CURLOPT_URL, "ftp://" . $host . "/" . $path_split[2] . "/" . $path_split[3] . "/" .
            rawurlencode(mb_convert_encoding($path_split[sizeof($path_split) - 1], "gb2312", "utf-8")));
        $outfile = fopen($fileSavePath, 'w+');  //保存到本地文件的文件名
        curl_setopt($curlobj, CURLOPT_FILE, $outfile);
        $rtn = curl_exec($curlobj);
        if (curl_errno($curlobj)) {
            writeLog('Curl error: ' . curl_error($curlobj));
        }
        fclose($outfile);
        curl_close($curlobj);
        if ($rtn == 1) {
            return true;
        } else {
            unlink($fileSavePath);//如果下載失敗,但是本地open了這個文件,所以要刪除
            return false;
        }
    }
這裏的重點是需要先通過mb_convert_encoding函數將文件名從utf-8轉爲gb2312,我本地的代碼都是以utf-8保存的.而ftp的連接是通過gb2312保存的.之後再通過rawurlencode進行加密就可得到[%C4%A7%B6%BC%D2%B9%BE%B0]
而如果不使用mb_convert_encoding函數直接rawurlencode的話得到的是UTF-8加密後的代碼[%E9%9D%92%E8%97%8F%E9%AB%98%E5%8E%9F%E6%97%85%E6%B8%B8%E6%8C%87%E5%8D%97]

另外還有一點需要注意的是,phpstorm的設置裏搜索encode,
將encode相關的選項選爲utf-8,否則調試時,debug裏顯示的變量值會變成亂碼.
在這裏插入圖片描述
在這裏插入圖片描述

最後補充幾句:
NAS是有提供SMB服務的,
本想通過php直接訪問smb服務,後來發現php要訪問smb服務有點難,加上mac本本是catalina系統,權限被加強了,導致各種permission denied…
後又想通過php直接執行shell命令方式下載到本來,shell單獨執行沒有任何問題,一到php裏執行,system(),exec()各種試,各種返回127,126…無奈…
最後還是通過ftp解決了…
方法很多,條條大路通羅馬,雖然我只通了1條.另外2條看看csdn裏有沒有高人指點一二…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章