微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php中文传到后台乱码怎么办

PHP中文传到后台乱码的解决办法:1、使用“iconv('UTF-8', 'GB2312//IGnorE', $targetFile);”;2、使用“move_uploaded_file($tempFile, $targetFile);”。

本文操作环境:Windows7系统,PHP7.1版,Dell G3电脑。

PHP中文传到后台乱码怎么办?

PHP文件上传后台存储中文乱码问题解决方案:

PHP文件上传后台处理讲解:

用户上传文件后(前端我用的是uploadify2.3),我希望按照它原有的文件名保存(有时是中文),只用PHP的move_uploaded_file命令会出现乱码(我是ubuntu的服务器)。需要先用icotargetFile=iconv(′UTF−8′,′GB2312//IGnorE′,targetFile);不加IGnorE的话iconv会对— (横杠)这一字符转换失败,并且后面自动截断。例如:

iconv('UTF-8', 'GB2312//IGnorE', 博客—yet); // 输出博客yet
iconv('UTF-8', 'GB2312//IGnorE', 博客—yet); // 输出博客

所以正确的存储方法是:

$targetFile = iconv('UTF-8', 'GB2312//IGnorE', $targetFile); // UTF8转GB2312
move_uploaded_file($tempFile, $targetFile);  // 服务器把文件暂时放在$tempFile

因为转码会损失字符,我们需要将新文件名保存,为了确定到底那些字符丢失,我使用了这样来回转换的trick:

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

PHP文件下载后台处理讲解:

其中何时使用GB2312,何时UTF8很重要。

此外ob_clean()和flush()是下载来的文件是否乱码的关键

<?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文件系统函数的输入一定要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在这文件里
    $tempFile = $_FILES['Filedata']['tmp_name'];
    $originalName = $_FILES['Filedata']['name'];
    if (empty($tempFile)) { die(抱歉,由于服务器原因,文件上传失败); }
    $dateYmd = date(Ymd,strtotime(Now));
    $targetPath = $ROOT.$attachmentDir.$dateYmd.'/'; //存储文件夹(绝对路径)
    mkdir($targetPath, 0777, true);
    $new_dir_name = new_name($_FILES['Filedata']['name']); //将文件名md5加密,仅保留最后一个后缀 
    mkdir($targetPath.$new_dir_name, 0777, true);
    $targetFile = $targetPath.$new_dir_name.'/'.$originalName;
    //移动tmp文件到指定位置,并防止中文文件名乱码。(tmp文件是服务器自动生成的)
    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教程

原文地址:https://www.jb51.cc/php/2916506.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐