Linux下中文檔名亂碼問題的詳解
最近做的專案中,涉及Linux下生成中文檔名並壓縮打包下載亂碼問題,需要將生成的壓縮包檔案自定義重新命名(包括中文),問題來了,Linux下不支援中文的,所以會導致中文亂碼問題,網上找了幾天,都沒解決,現在終於給碼出來了,希望大家指出缺點。
首先,讓linux支援中文,就是在/usr/lib/locale的預設中,新增以下三句,或者註釋掉這三句前的#
zh_CN.GBK GBK
zh_CN.GB18030 GB18030
zh_CN.UTF-8 UTF-8
其次,由於下載的檔案會把目錄整個顯示,之前轉載別人的文章,
使用了pathinfo函式去獲取他的basename,就避免了目錄結構被暴露,
原來,文字編碼中windows預設是GBK,而Linux預設是UTF-8,
這樣就導致輸出的是亂碼,亂碼的文字被自動忽略。
所以我重新寫了一個pathinfo函式 path_info() 。
分享自己的code:
if($action == "downreport"){
if(substr($report_ids,-1)==","){
$report_ids = substr($report_ids,0,-1);
}
$report_id = $report_ids;
if($report_id == '0'){
die("{success:false,msg:'error',code:'e8000'}");
}
if(strpos($report_id,',')){
$arrids = explode(',',$report_id );
$newids = array();
foreach($arrids as $id){
$newids []= intval($id);
}
$ids = implodeids($newids);
$reports = array();
$reports_name = array();
$paths = array();
$query = $db->query("select `name`,filename from report_list where id in ($ids)" );
while($report = $db->fetch_array($query)){
$reports[]= $report['filename'];
$reports_name[]= $report['name'];
}
for($i = 0; $i < count($reports); $i++ ){
$j = 1;
$temp_fileName = $reports_name[$i]."_";
while(file_exists(ESHINE_ROOT."tmp/temp/".$reports_name[$i] .".zip")){
$reports_name[$i] = $temp_fileName.$j;
$j++;
}
//$reports_name[$i] = $temp_fileName;
copy(ESHINE_ROOT."Report/".$reports[$i].".zip",ESHINE_ROOT."tmp/temp/".$reports_name[$i].".zip");
$paths[$i] = ESHINE_ROOT."tmp/temp/".$reports_name[$i].".zip";
}
//重寫pathinfo函式,解決中文被置空 2014.11.26
function path_info($filepath)
{
$path_parts = array();
$path_parts ['dirname'] = rtrim(substr($filepath, 0, strrpos($filepath, '/')),"/")."/";
$path_parts ['basename'] = ltrim(substr($filepath, strrpos($filepath, '/')),"/");
$path_parts ['extension'] = substr(strrchr($filepath, '.'), 1);
$path_parts ['filename'] = ltrim(substr($path_parts ['basename'], 0, strrpos($path_parts ['basename'], '.')),"/");
return $path_parts;
}
//建立壓縮包 2014.11.24
function create_zip($files=array(),$destination='',$overwrite=false){
//if the zip file already exists and overwrite is false, return false
//如果zip檔案已經存在並且設定為不重寫返回false
if(file_exists($destination) && !$overwrite){
return false;
}
$valid_files=array();
//獲取到真實有效的檔名
if(is_array($files)){
//cycle through each file
foreach($files as $file){
//make sure the file exists
if(file_exists($file)){
$valid_files[]=$file;
}
}
}
//如果存在真實有效的檔案
if(count($valid_files)){
//create the archive
$zip = new ZipArchive();
//開啟檔案 如果檔案已經存在則覆蓋,如果沒有則建立
if($zip->open($destination,$overwrite?ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE)!==true){
return false;
}
//向壓縮檔案add the files
foreach($valid_files as $file){
//$zip->addFile($file,$file);
//$file_info_arr= pathinfo($file);
$file_info_arr = path_info($file);
$filename = $file_info_arr['basename'];
$filename = iconv('UTF-8', 'GBK//IGNORE', $filename);
//die($filename);
$zip->addFile($file,$filename);
}
$zip->close();
//check to make sure the file exists //檢測檔案是否存在
return file_exists($destination);
}else{
return false;
}
}
if(create_zip($paths,ESHINE_ROOT."tmp/temp/".$tempFileName.".zip",true)){
$newfiles = ESHINE_ROOT."tmp/temp/".$tempFileName.".zip";
}
//sleep(1);
$tempFileName = date("YmdHis",time()).mt_rand(1000, 9999);
for($i = 0; $i < count($paths); $i++ ){
@unlink($paths[$i]);
}
if(!$newfiles){
echo 'Not Found' . $newfiles;
exit;
}else{
header("Content-type: application/octet-stream");
//header("Content-type: application/force-download");
header("Accept-Ranges: bytes");
header("Accept-Length: ".filesize($newfiles));
header("Content-Disposition: attachment; filename=".$tempFileName.".zip");
//header('Content-Type: application/octet-stream; name=' . $out_filename);
touch($newfiles);
$file = fopen($newfiles, "r");
//echo fread($file, filesize($newfiles));
$buffer = 1024; //
//判斷檔案是否讀完
while (!feof($file)) {
//將檔案讀入記憶體
$file_data = fread($file, $buffer);
//每次向客戶端回送1024個位元組的資料
echo $file_data;
}
fclose($file);
unlink($newfiles);
writelog($msg_download_log_reportlist.$newfiles);
}
}
}
相關推薦
Linux下中文檔名亂碼問題的詳解
最近做的專案中,涉及Linux下生成中文檔名並壓縮打包下載亂碼問題,需要將生成的壓縮包檔案自定義重新命名(包括中文),問題來了,Linux下不支援中文的,所以會導致中文亂碼問題,網上找了幾天,都沒解決,現在終於給碼出來了,希望大家指出缺點。 首先,讓linux
Linux 下hosts文件詳解
domain none oca 不同 詳解 als 機器 區別 int Linux 下hosts文件詳解 主機名: 無論在局域網還是INTERNET上,每臺主機都有一個IP地址,是為了區分此臺主機和彼臺主機,也就是說IP地址就是主機的門牌號。 公網:IP地
【轉載】linux下的mount命令詳解;
文件的 flag 自動加載 網絡文件系統 解決問題 選項 lock home 多個參數 以下內容來自:http://blog.csdn.net/clozxy/article/details/5299054 http://linux.chinaunix.net/techdo
Linux下使用Corosync+Pacemaker詳解及安裝
corosync pacemaker 珠聯璧合 Corosync詳解OpenAIS概述OpenAIS是基於SA Forum 標準的集群框架的應用程序接口規範。OpenAIS提供一種集群模式,這個模式包括集群框架,集群成員管理,通信方式,集群監測等,能夠為集群軟件或工具提供滿足 AIS標準的集
Linux下inittab文件詳解
tle sso 根據 UC number mage failure 並且 命令行模式 /etc/inittab文件詳解 Linux系統的啟動過程為:加電自檢-->根據BIOS中的設置從指定的設備啟動-->找到設備MBR中的bootloader引導啟動系統--&
linux下路由設置詳解
RoCE ive sys 路由route 寫入文件 路由表 ado per 數據 路由表信息解釋 ##名詞解釋:Active Routes:活動的路由Network destination :目的網段Netmask:子網掩碼Gateway:網關,又稱下一跳路由器。在發送
Linux下套接字詳解---epoll模式下的IO多路複用伺服器
1 epoll模型簡介 epoll可是當前在Linux下開發大規模併發網路程式的熱門人選,epoll 在Linux2.6核心中正式引入,和select相似,其實都I/O多路複用技術而已,並沒有什麼神祕的。 其實在Linux下設計併發網路程式,向來不缺少方法,比如典型的Apache模型(Proce
Linux下clock gettime函式詳解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
linux 下的連結檔案詳解
轉載來自:http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml 轉載來自:(這個哥們加工了的,各種顏色,美化)http://www.cnblogs.com/li-hao/p/4107964.html
【轉載】Linux下安裝軟體命令詳解
【轉載日期】2018.09.11 【轉載標題】Linux下安裝軟體命令詳解 ----------------------------------------------------------------------------------------------
linux下opensll加解密詳解
1、使用tar對檔案壓縮加密: 在當前目錄下有一個pma目錄的資料夾: tar -zcvf - pma|openssl des3 -salt -k password | dd of=pma.des3 完成將得到一個pma.des3的打包檔案,用你設定的密碼替換password。 2、使用ta
Linux下MongoDB 安裝配置詳解
1.MongoDB簡單說明 a MongoDB是由C++語言編寫的一個基於分散式檔案儲存的開源資料庫系統,它的目的在於為WEB應用提供可擴充套件的高效能資料儲存解決方案。 b MongoDB是一個介於關係型資料庫和非關係型資料庫之間的產品,是非關係型資料庫當中功能
(筆記)Linux下的ioctl()函式詳解
我這裡說的ioctl函式是指驅動程式裡的,因為我不知道還有沒有別的場合用到了它,所以就規定了我們討論的範圍。寫這篇文章是因為我前一陣子被ioctl給搞混了,這幾天才弄明白它,於是在這裡清理一下頭腦。 一、 什麼是ioctl ioctl是裝置驅動程
linux下配置yum源詳解
本人使用的方法一,成功配置,方法二沒測過,可以作為參考 方法一: 1.確保RHEL5中已經安裝了yum [[email protected] ~]# rpm -qa |grep yum yum-metadata-parser-1.1.2-3.el5 yum-up
linux下的tar命令詳解
通過SSH訪問伺服器,難免會要用到壓縮,解壓縮,打包,解包等,這時候tar命令就是是必不可少的一個功能強大的工具。linux中最流行的tar是麻雀雖小,五臟俱全,功能強大。 tar命令可以為linux的檔案和目錄建立檔案。利用tar,可以為某一特定檔案建立檔案(備份檔案),也可以在檔案中改變檔案,或者向檔案
Tomact8部署在linux下啟動很慢詳解
轉載老大的部落格~我們當時遇到的實際問題解決辦法,作為一個記錄 ————————————————————分割線—————————————————— Tomcat 8熵池阻塞變慢詳解 Tomcat 8啟動很慢,且日誌上無任何錯誤,在日誌中檢視到如下資訊: Log4j:[2015-10-29 15:4
【轉發】centos 7開啟FTP以及新增使用者配置許可權,只允許訪問自身目錄,不能跳轉根目錄 linux下ftp配置檔案詳解
1.切換到root使用者 2.檢視是否安裝vsftp,我這個是已經安裝的。 [[email protected] vsftpd]# rpm -qa |grep vsftpd vsftpd-3.0.2-11.el7_2.x86_64 3.如果沒有發現,則安裝。 yum ins
Linux下原始碼編譯安裝詳解
前言 原始碼要執行,必須先轉成二進位制的機器碼。這是編譯器的任務。 比如,下面這段原始碼(假定檔名叫做test.c)。 #include <stdio.h> int main(void) { fputs("Hello, world!\n", stdout
Linux下套接字詳解(十)---epoll模式下的IO多路複用伺服器
1 epoll模型簡介 epoll可是當前在Linux下開發大規模併發網路程式的熱門人選,epoll 在Linux2.6核心中正式引入,和select相似,其實都I/O多路複用技術而已,並沒有什麼神祕的。 其實在Linux下設計併發網路程式,向來不缺少
day77_淘淘商城專案_10_ Linux下的Nginx代理詳解(配置虛擬主機+實現反向代理+實現負載均衡+高可用) + 單點登入系統工程搭建 + SSO系統介面文件講解_匠心筆記
淘淘商城專案_10 1、目前訪問系統使用的方式存在的問題 2、什麼是nginx 3、nginx的應用場景 4、nginx的安裝 4.1、要求的安裝環境 4.2、安裝步驟 4.3、啟動nginx