用PHP接收上传文件,文件名中的中文部分在服务器端显示为问号?

酷睿N核 2018-05-29 04:09:57
【遇到的问题】

尝试使用 PHP 接收上传文件,文件接收成功,但是文件名中的中文部分在服务器端却一直显示为问号?



使用 FTP 上传的中文名文件可正常显示;

文件内容中的中文字符也没有问题!

【进行过的尝试】

自己判断应该是编码问题,但是分别使用了——

iconv('UTF-8','gbk',$_FILES['userfile']['name']);

iconv('UTF-8','gb2312',$_FILES['userfile']['name']);

iconv('gbk','UTF-8',$_FILES['userfile']['name']);

iconv('gb2312','UTF-8',$_FILES['userfile']['name']);


均没有成功。

另外还尝试先将上传文件另存为“UTF-8”的编码,结果一样!

【测试环境】

服务器端
主机类型:阿里云虚拟主机
操作系统:CentOS 6.5 64位
PHP版本:PHP5.5

客户端
操作系统:Windows 10 家庭中文版 1803

【相关代码】

upload.html(上传)
<html>
<head>
<title>Administration - upload new files</title>
</head>
<body>
<h1>Upload new news files</h1>
<form action="upload.php" method="post" enctype="multipart/form-data">
<div>
<input type="hidden" name="MAX_FILE_SIZE" value="1000000"/>
<label for="userfile">Upload a file:</label>
<input type="file" name="userfile" id="userfile"/>
<input type="submit" value="Send File"/>
</div>
</form>
</body>
</html>


upload.php(接收)
<html>
<head>
<title>Uploading...</title>
</head>
<body>
<h1>Uploading file...</h1>
<?php
$filename=iconv('UTF-8','gbk',$_FILES['userfile']['name']);
$upfile='../uploads/'.$filename;
if(is_uploaded_file($_FILES['userfile']['tmp_name'])){
if(!move_uploaded_file($_FILES['userfile']['tmp_name'],$upfile)){
echo "Problem:Could not move file to destination directory.";
exit;
}
}else{
echo "Problem:Possible file upload attack.Filename:".$filename;
exit;
}
echo "File uploaded successfully.<br/><br/>";
?>
</body>
</html>
...全文
1044 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_38740155 2018-05-30
  • 打赏
  • 举报
回复
这一般的都是命名的英文吧,中文很多FTP上传到空间都是乱码,编码格式不对
伟洪winni 2018-05-30
  • 打赏
  • 举报
回复
中文乱码, 一般用户上传的文件会给他重新命名
A_5120 2018-05-30
  • 打赏
  • 举报
回复
乱码肯定是编码不统一导致的,没别的理由,所以最好还是用英文数字下划线重新命名
酷睿N核 2018-05-29
  • 打赏
  • 举报
回复
啊啊,我研究出来了,在前端添加 <meta charset="gbk"> 后就成功了。 不过有一个疑问就是,为什么使用 iconv() 不行呢?
yt_php 2018-05-29
  • 打赏
  • 举报
回复
一般不建议用中文文件名,改成英文即可。
PHP基本语法(五)状态维持 大纲 HTTP基础 变量 服务器信息 状态维持概念 session COOKIE 1、HTTP基础 作用:当WEB请求一个WEB页面时,它会向服务器发送一个HTTP请求消息。这个请求总是包含一些头信息,有时也包含一个消息体。WEB服务器接收请求,处理请求,并发出一个响应,传回指定的HTML代码 2、变量 使用PHP脚本语言访问服务器配置和请求信息(包括表单参数和cookie)的方法。总的来说,此信息被称为EGPCS(环境、GET、POST、cookie和服务器)。 注意:如果PHP.ini文件的register_globals选项被启动,PHP就会为每一个表单参数、请求信息片和服务器配置值,创建一个独立的全局变量,因为此功能允许浏览器为程序的变量提供初始值,所以它虽然方便,但也很危险。 3、服务器信息 PHP将创建6个包含EGPCS信息的全局数组,这些数数组为: $HTTP_COOKIE_VARS(简写:$_COOKIE) 包含作为请求的一部分进行传递的cookie值,数组的键是cookie名。 $HTTP_GET_VARS(简写:$_GET) 包含做为GET请求的一部分进行传递的参数,数组的键是表单参数名称。 $HTTP_POST_VARS(简写:$_POST) 包含做为POST请求的一部分进行传递的参数,数组的键是表单参数名。 $HTTP_POST_FILES(简写:$_FILES) 包含有关上传文件的信息。 $HTTP_SERVER_VARS(简写:$_SERVER) 包含有关WEB服务器的有用信息(将在下一节描述) $HTTP_ENV_VARS(简写:$_ENV) 包含环境变量值,数组的键是环境变量名。 服务器信息$_SERVER以下是$_SERVER的全部条目的列表: 格式:$_SERVER["数组标识"] 1.SERVER_SOFTWARE 一个用于标识服务器的字符串 2.SERVER_NAME 用于自引用URL的主机名、DNS别名或IP地址 3.GATEWAY_INTERFACE 所遵循的CGI标准的版本号 4.SERVER_PROTOCOL 请求协议的名称和版本 5.SERVER_PORT 请求发送到的服务器端口号 6.REQUEST_METHOD 客户端用于获取文档的方法,例如:“GET” 7.PATH_INFO 客户端发送的扩展路径,例如:"/list/users" 8.PATH_TRANSLATED PATH_INFO的值,由服务器转换成文件名,例如:"/home/httpd/htdocs/list/users" 9.SCRIPT_NAME 当前页面的URL路径,用于自引用脚本,例如:"/~me/menu.php" 10.QUERY_STRING 所在问号之后的URL,例如:"name=fred+age=35" 11.REMOTE_STRING 请求本页的主机机器名,如果主机没有DNS,则此值为空,并且只给出REMOTE_ADDR信息 12.REMOTE_USER 一个字符串,包含请求本页的机器的IP地址,例如:”192.168.10.243“ 4、状态维持的概念 状态维持的概念 1.什么是状态 2.状态的用处 3.维持状态的三种方法 GET、POST方法、COOKIE、SESSION 在PHP,每个用户的状态都是唯一的,而用于标识状态的ID是一个经过加密的随机字符串,它由PHP自动生成,在状态的生命周期会保存在客户端或服务器端。我们通常用PHP的Cookie将它保存在客户端,用Session把它保存在服务器端,或者通过URL在多页面间进行相互传递。 状态ID就好像一个索引,它允许我们注册一些特定的变量,这些变量又称为状态变量。它们的内容被保存在服务器端,而状态ID是客户端唯一可以获得的信息。 SESSION(会话)的使用 会话提供了从不同页面的访问和对站点的多次访问都能使用的持久性变量。 课程顺序: 1.如何启用会话 2.如何注册一个会话变量 3.验证是否注册一个会话变量 4.删除会话变量 优酷网视频地址: http://v.youku.com/v_show/id_XMTY3NTAzMzM2.html http://v.youku.com/v_show/id_XMTY3NTEwMDgw.html http://www.dengwei1999.com/video_list-6.html

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧