UTF-8 的中文檔案名上傳問題
在上传文件后,一般都会用 move_uploaded_file() 进行文件移动改名。但是 move_uploaded_file() 并不支持 UTF-8 编码,如果含有,那么函数就会执行失败,但是这个函数是支持 GB2312 或者是 GBK 编码的,因此可以利用 iconv() 函数先进行名字转换来来解决问题。有两种情况:
1. 服务器是中文 Windows 环境
在服务器是中文 Windows 环境下,由于中文 Windows 系统的编码是 GB2312,那么可以如下使用代码:
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 下也能正常显示中文名称,如下面代码所示:
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 的中文檔案名上傳問題的更多相关文章
- C# 選擇本機檔案並上傳
參考自:http://www.dotblogs.com.tw/puma/archive/2008/11/07/5910.aspxhttp://www.codeproject.com/Articles/ ...
- [ASP.NET] 如何利用Javascript分割檔案上傳至後端合併
最近研究了一下如何利用javascript進行檔案分割上傳並且透過後端.特地記錄一下相關的用法 先寫限制跟本篇的一些陷阱 1.就是瀏覽器的支援了 因為本篇有用到blob跟webworker 在ie中需 ...
- C++ 檔案、資料夾、路徑處理函式庫:boost::filesystem
原帖:https://tokyo.zxproxy.com/browse.php?u=uG7kXsFlW1ZmaxKEvCzu8HrCJ0bXIAddA1s5dtIUZ%2FYzM1u9JI7jjKLT ...
- 在 Server 端存取 Excel 檔案的利器:NPOI Library
转处 http://msdn.microsoft.com/zh-tw/ee818993.aspx Codeplex 軟體套件(Package)資訊 套件名稱 NPOI 作者 tonyqus, huse ...
- 如何在 Visual Studio 2012 控制 TFS 版控時要忽略哪些檔案
幾乎在任何一種版本控管的機制裡,都會遇到那些「不應該簽入到版本庫」的潛規則,以往我們在用 SVN 的時候,我就寫過幾篇文章要大家注意這點.最近都改用 TFS 做版控,因為大多使用 Visual Stu ...
- [Python學習筆記] 抓出msg信件檔裡的附件檔案
想要把msg信件檔案的附件抓出來做處理,找到了這個Python 模組 msg-extractor 使用十分容易,但是這個模組是要在terminal裡執行,無法直接打在IDLE的編輯器上 所以稍微做了修 ...
- .net批量上傳Csv檔資料應用程序開發總結
應用環境:visual studio 2010開發工具,Database為Sql2008以上版本 最近在生產環境中需要開發一款應用程式,上傳電子檔(.csv)資料至Database 最初方案: 以tx ...
- 何解決 LinqToExcel 發生「無法載入檔案或組件」問題何解決 LinqToExcel 發生「無法載入檔案或組件」問題
在自己的主機上透過 Visual Studio 2013 與 IISExpress 開發與測試都還正常,但只要部署到測試機或正式機,就是沒辦法順利執行,卡關許久之後找我協助.我發現錯誤訊息確實很「一般 ...
- Linux 下找出超過某些容量的檔案
找目前所在位置下,所有檔案大小超過3M的file,並列出檔名:大小 find . -type f -size +3M -exec ls -alh {} \; | awk '{print$9 " ...
随机推荐
- CSS3 loading 和 文字颜色渐变
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- DNS隧道之DNS2TCP使用心得教程——是可以用来穿透qiang的,ubuntu下直接apt install dns2tcp
DNS隧道之DNS2TCP使用心得教程 转自:http://blog.creke.net/750.html DNS2TCP是在上次DNS隧道大检阅时提到的一个DNS隧道. 在2010年6月的更新(也是 ...
- CREATE SCHEMA - 定义一个新的模式
SYNOPSIS CREATE SCHEMA schemaname [ AUTHORIZATION username ] [ schema_element [ ... ] ] CREATE SCHEM ...
- 使用 reduce 实现数组 map 方法
//使用 reduce 实现数组 map 方法 const selfMap2 = function (fn, context){ let arr = Array.prototype.slice.cal ...
- web.xml的简单解释以及Hello1中web.xml的简单分析
一.web.xml的加载过程 ①当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等).首先会去读取web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常的被启动 ...
- Maven常用仓库地址以及手动添加jar包到仓库
http://www.blogjava.net/fancydeepin 共有的仓库 http://repository.sonatype.org/content/groups/public/http: ...
- react.js工程结构
1.index.html :UI界面入口.挂在点: 2.manifest.json:应用说明 3.package.json:工程说明.依赖说明等 4.source : 代码源文件
- Java中this、static关键字的内存图解
Java中的关键字有很多,abstract default goto* null switch boolean do if package nchronzed break dou ...
- 微信小程序(template的使用)
小程序的template是一个模版功能,在创建一个template后,其他的页面可以引用,相比component较简单.方便! template只需要两个文件,一个wxss文件和wxml文件,也只有这 ...
- virtualbox虚拟机桥接方式网络设置
一.编辑网卡 cd /etc/sysconfig/network-scripts 查看本地win10ip及子网掩码: 如果查看到的ip不是192开头的,可以手动设置为192开头的ip 2.设置虚拟 ...