在上传文件后,一般都会用 move_uploaded_file() 进行文件移动改名。但是 move_uploaded_file() 并不支持 UTF-8 编码,如果含有,那么函数就会执行失败,但是这个函数是支持 GB2312 或者是 GBK 编码的,因此可以利用 iconv() 函数先进行名字转换来来解决问题。有两种情况:

1. 服务器是中文 Windows 环境
在服务器是中文 Windows 环境下,由于中文 Windows 系统的编码是 GB2312,那么可以如下使用代码:

[Plain Text] 纯文本查看 复制代码
1
2
$upload_file = iconv("UTF-8", "GB2312", $_FILES["myfile"]["name"]);
move_uploaded_file($_FILES["myfile"]["tmp_name"], $upload_file)

上面代码的意思是,先用 iconv() 函数对上传文件名转换为 GB2312 码(上传的文件名若含有中文,那么使用 UTF-8 编码),然后再进行 move_uploaded_file() 改名。这样在中文系统下就可以正常显示了。但是 Linux 系统本身就是使用 UTF-8 来编码的,因此想要在 Linux 下正常显示中文,那么就再次 iconv() 转换一下,这是下面所说的第 2 种情况。

2. 服务器是 Linux 系统
如上面所讲,利用 move_uploaded_file() 函数支持 GBK 的特性,那么我们可以利用再次转换的小技巧使上传的文件名中含有中文的文件在 Linux 下也能正常显示中文名称,如下面代码所示:

[PHP] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
<?php
        $upload_file = iconv("UTF-8", "GBK", $_FILES["myfile"]["name"]);   //先转换名字为 GBK 编码
        if (move_uploaded_file($_FILES["myfile"]["tmp_name"], $upload_file)) {
                $res_file = iconv("GBK", "UTF-8", $upload_file);    // 再从 GBK 转为 UTF-8
                rename($upload_file, $res_file);   // 重命名一下文件
                echo "<strong>upload ok</strong><hr>";
        } else {
                echo "upload failed";
        }
 
?>

运行输出:
<1> 上传一个文件名中含有中文的文件:

<2> 检查在 Linux 下是否正常显示:

utf-8 編碼網頁無法在 big5 系統正確處理中文檔名,原因在於 move_uploaded_file() 不能處理 utf-8 中文編碼,需利用 iconv() 函數作轉碼,解決方法如下:

請將
move_uploaded_file($_FILES['myfile']['tmp_name'], $uploadfile)改為
move_uploaded_file($_FILES['myfile']['tmp_name'], iconv("utf-8", "big5", $uploadfile))

UTF-8 的中文檔案名上傳問題的更多相关文章

  1. C# 選擇本機檔案並上傳

    參考自:http://www.dotblogs.com.tw/puma/archive/2008/11/07/5910.aspxhttp://www.codeproject.com/Articles/ ...

  2. [ASP.NET] 如何利用Javascript分割檔案上傳至後端合併

    最近研究了一下如何利用javascript進行檔案分割上傳並且透過後端.特地記錄一下相關的用法 先寫限制跟本篇的一些陷阱 1.就是瀏覽器的支援了 因為本篇有用到blob跟webworker 在ie中需 ...

  3. C++ 檔案、資料夾、路徑處理函式庫:boost::filesystem

    原帖:https://tokyo.zxproxy.com/browse.php?u=uG7kXsFlW1ZmaxKEvCzu8HrCJ0bXIAddA1s5dtIUZ%2FYzM1u9JI7jjKLT ...

  4. 在 Server 端存取 Excel 檔案的利器:NPOI Library

    转处 http://msdn.microsoft.com/zh-tw/ee818993.aspx Codeplex 軟體套件(Package)資訊 套件名稱 NPOI 作者 tonyqus, huse ...

  5. 如何在 Visual Studio 2012 控制 TFS 版控時要忽略哪些檔案

    幾乎在任何一種版本控管的機制裡,都會遇到那些「不應該簽入到版本庫」的潛規則,以往我們在用 SVN 的時候,我就寫過幾篇文章要大家注意這點.最近都改用 TFS 做版控,因為大多使用 Visual Stu ...

  6. [Python學習筆記] 抓出msg信件檔裡的附件檔案

    想要把msg信件檔案的附件抓出來做處理,找到了這個Python 模組 msg-extractor 使用十分容易,但是這個模組是要在terminal裡執行,無法直接打在IDLE的編輯器上 所以稍微做了修 ...

  7. .net批量上傳Csv檔資料應用程序開發總結

    應用環境:visual studio 2010開發工具,Database為Sql2008以上版本 最近在生產環境中需要開發一款應用程式,上傳電子檔(.csv)資料至Database 最初方案: 以tx ...

  8. 何解決 LinqToExcel 發生「無法載入檔案或組件」問題何解決 LinqToExcel 發生「無法載入檔案或組件」問題

    在自己的主機上透過 Visual Studio 2013 與 IISExpress 開發與測試都還正常,但只要部署到測試機或正式機,就是沒辦法順利執行,卡關許久之後找我協助.我發現錯誤訊息確實很「一般 ...

  9. Linux 下找出超過某些容量的檔案

    找目前所在位置下,所有檔案大小超過3M的file,並列出檔名:大小 find . -type f -size +3M -exec ls -alh {} \; | awk '{print$9 " ...

随机推荐

  1. springboot Tomcat connector configured to listen on port 8081 failed to start.

    启动报 Tomcat connector configured to listen on port 8081 failed to start.   The port may already be in ...

  2. CentOS 初体验十四:阿里云安装Gitlab

    网址:https://about.gitlab.com/install/#centos-7 https://blog.csdn.net/zhaoyanjun6/article/details/7914 ...

  3. PHP:Invalid argument supplied for foreach()错误原因及解决办法

    在php中使用foreach循环遍历时报Invalid argument supplied for foreach()错误,是因为循环的数据不是一个有效的数组. 因此我们只要在foreach之前判断一 ...

  4. 学习 Qt 编程的好书精品推荐!

    最近一段时间,准备开始搞Qt方面的东西,想找几本书看看.网上介绍QT的书籍也有很多,不想浪费时间,所以想找几本精品的书籍来看.花了半天的时间找了几本非常不错的,这里面整理好之后推荐给大家! 下面介绍的 ...

  5. Python面向对象之多态

    多态 面向对象三大特性 封装 根据职责将属性和方法封装到一个抽象的类中:--定义类的准则 继承 实现代码的重用,相同的代码不需要重复的编写:--设计类的技巧:子类针对自己的需求,编写特定的代码: 多态 ...

  6. 2017 计蒜之道 初赛 第一场 B阿里天池的新任务(简单)

    题链:"https://nanti.jisuanke.com/t/15500" 本来希望通过找循环节然后套KMP来通过后面题的,可是只过了B题,可能循环节不一定是存在的. #inc ...

  7. openstack -> openinfra

    https://www.openstack.org/assets/software/projectmap/openstack-map.pdf

  8. 60. Spring Boot写后感【从零开始学Spring Boot】

    从2016年4月15日到2016年7月20日经历长达3个月的时间,[从零开始学习Spring Boot]系列就要告一段落了.国内的各种资源都比较乱或者是copy 来copy去的,错了也不加以修正下,导 ...

  9. [BZOJ1029] [JSOI2007]建筑抢修(贪心 + 优先队列)

    传送门 把数据存在结构体中,至于怎么贪心? 肯定会有些想法,正确错误先不必说,先来试一试. 1.按照 t2 为第一关键字从小到大排,按照 t1 为第二关键字从小到大排 这个显然错,比如后面有个数的 t ...

  10. hdu 1698区间延迟更新

    #include<stdio.h> #define N 100100 struct node { int x,y,yanchi; }a[N*4];//注意数组范围 void build(i ...