溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php中文傳到后臺(tái)亂碼的解決方法

發(fā)布時(shí)間:2021-12-21 10:04:25 來源:億速云 閱讀:138 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“php中文傳到后臺(tái)亂碼的解決方法”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“php中文傳到后臺(tái)亂碼的解決方法”這篇文章吧。

php中文傳到后臺(tái)亂碼的解決辦法:1、使用“iconv('UTF-8', 'GB2312//IGNORE', $targetFile);”;2、使用“move_uploaded_file($tempFile, $targetFile);”。

本文操作環(huán)境:Windows7系統(tǒng),PHP7.1版,Dell G3電腦。

php文件上傳后臺(tái)存儲(chǔ)中文亂碼問題解決方案:

php文件上傳后臺(tái)處理講解:

用戶上傳文件后(前端我用的是uploadify2.3),我希望按照它原有的文件名保存(有時(shí)是中文),只用php的move_uploaded_file命令會(huì)出現(xiàn)亂碼(我是ubuntu的服務(wù)器)。需要先用icotargetFile=iconv(′UTF?8′,′GB2312//IGNORE′,targetFile);不加IGNORE的話iconv會(huì)對(duì)— (橫杠)這一字符轉(zhuǎn)換失敗,并且后面自動(dòng)截?cái)唷@纾?/p>

iconv('UTF-8', 'GB2312//IGNORE', "博客—yet"); // 輸出"博客yet"
iconv('UTF-8', 'GB2312//IGNORE', "博客—yet"); // 輸出"博客"

所以正確的存儲(chǔ)方法是:

$targetFile = iconv('UTF-8', 'GB2312//IGNORE', $targetFile); // UTF8轉(zhuǎn)GB2312
move_uploaded_file($tempFile, $targetFile);  // 服務(wù)器把文件暫時(shí)放在$tempFile

因?yàn)檗D(zhuǎn)碼會(huì)損失字符,我們需要將新文件名保存,為了確定到底那些字符丟失,我使用了這樣來回轉(zhuǎn)換的trick:

$targetFile = iconv('GB2312', 'UTF-8//IGNORE', $targetFile );

php文件下載后臺(tái)處理講解:

其中何時(shí)使用GB2312,何時(shí)UTF8很重要。

此外ob_clean()和flush()是下載來的文件是否亂碼的關(guān)鍵

<?php
$ROOT = $_SERVER["DOCUMENT_ROOT"]; // 獲取根路徑
$filename = $_GET["filename"]; // GET方式拿到文件名
$filepath = $ROOT.$filename; // 文件路徑UFT8版
$filepath_iconv = iconv('UTF-8', 'GB2312//IGNORE', $ROOT.$filename); // 文件路徑GB2312版
if (is_file($filepath_iconv))  
// 和上面一樣,php的文件系統(tǒng)函數(shù)的輸入一定要GB2312字符,否則is_file返回false
{ 
    $fileinfo = pathinfo($filepath); // 返回給客戶端的用UFT8
    header('Content-type: application/x-'.$fileinfo['extension']);
    header('Content-Disposition: attachment; filename='.$fileinfo['basename']);
    header('Content-Length: '.filesize($filepath_iconv)); // GB2312才能訪問文件
    ob_clean();  // 如果不加這兩句的話,下載下來的文件是亂碼的
    flush();  // 如果不加這兩句的話,下載下來的文件是亂碼的
    readfile($filepath_iconv); // GB2312才能訪問文件
    exit();
}
else { die("文件不存在或已被刪除"); }
?>

下面是我搭配uploadify 2.3使用的文件上傳后端文件,僅供參考:

<?php
error_reporting(0); // 如果需要開啟php警告,刪除此句
if (!empty($_FILES)) {
    $my_articleDBtable = $_GET["my_articleDBtable"];
    require_once("../../init.php"); // $tmpimgUploadDir在這個(gè)文件里
    $tempFile = $_FILES['Filedata']['tmp_name'];
    $originalName = $_FILES['Filedata']['name'];
    if (empty($tempFile)) { die("抱歉,由于服務(wù)器原因,文件上傳失敗"); }
    $dateYmd = date("Ymd",strtotime("now"));
    $targetPath = $ROOT.$attachmentDir.$dateYmd.'/'; //存儲(chǔ)文件夾(絕對(duì)路徑)
    mkdir($targetPath, 0777, true);
    $new_dir_name = new_name($_FILES['Filedata']['name']); //將文件名md5加密,僅保留最后一個(gè)后綴 
    mkdir($targetPath.$new_dir_name, 0777, true);
    $targetFile = $targetPath.$new_dir_name.'/'.$originalName;
    //移動(dòng)tmp文件到指定位置,并防止中文文件名亂碼。(tmp文件是服務(wù)器自動(dòng)生成的)
    move_uploaded_file($tempFile, iconv('UTF-8', 'GB2312//IGNORE', $targetFile));
    $originalName = iconv('UTF-8', 'GB2312//IGNORE', $originalName);
    $originalName = iconv('GB2312', 'UTF-8//IGNORE', $originalName);
    //返回文件地址
    $filename = $originalName;
    $href = $ROOTTOSERVER.$attachmentDir.$dateYmd.'/'.$new_dir_name.'/'.$originalName;
    $filename = mysql_real_escape_string($filename);
    $href = mysql_real_escape_string($href);
    mysql_query("insert into `$my_articleDBtable` (articleName, articleContent) VALUES ('$filename','$href')") or die(mysql_error());
    die("success");
}
function new_name($filename){
    $ret = array();
    $ext = pathinfo($filename);
    $ext = $ext['extension'];
    $ext = strtolower($ext);
    if ($ext=='doc'|| $ext=='docx') 
    {
        $name = basename($filename,$ext); 
        $name = md5($name.time()); //.'.'.$ext;
        return $name;
    }
    die("文件名不合法");
}
?>


以上是“php中文傳到后臺(tái)亂碼的解決方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI