php中文传到后台乱码怎么办
2022-11-27 21:09:48
231
{{single.collect_count}}

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

php入门到就业线上直播课:进入学习
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API调试工具:点击使用

本文操作环境: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转GB2312move_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); // 返回给客户端的用UFT8header('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使用的文件上传后端文件,仅供参考:

<?phperror_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视频教程

以上就是php中文传到后台乱码怎么办的详细内容,更多请关注php中文网其它相关文章!

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}