最近用PHP做了一个简单的上传功能,结果出现了一个意想不到的问题。我上传的文件,在获取$_FILES的时候发现文件名的第一个字符被截掉了,因为最开始上传的一直是数字或者字母为名称的文档,也没有太在意这个问题,等到上传中文名称的文档的时候,问题来了,因为只截取了一个字符,而一个汉字是两个字符,所以,乱码出现了。而且不管是本机还是服务器,都出现同样的问题。到这时,我就不得不开始寻找原因了。

代码如下,一目了然。

文件upload.php的内容为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
<title>上传文件</title>
</head> <body>
<div id="welcome">
<form method="post" action="upload2.php" enctype="multipart/form-data" >
<input name="content" type="file"></input>
<input type="submit"/>
</form>
</div>
</body>
</html>

submit之后post到页面upload2.php,我们再看看里面的内容:

<?php
var_export($_FILES);

逻辑很简单毫无悬念对不对?但是就是出现了我上面描述的那个蛋疼的错误,具体的情况是什么样子的呢?我来描述一下。

首先我选中一个名称为“mima.txt”的文件,确定之后,打印出来的结果为:

array ( 'content' => array ( 'name' => 'ima.txt', 'type' => 'text/plain', 'tmp_name' =>
'D:\\wamp\\tmp\\php322.tmp', 'error' => 0, 'size' => 379, ), )

大家可以看到,第一个字符被截掉了,“mima.txt”变成了"ima.txt"。

现在我们来看看中文的,  我选中一个名称为“新建文本文档.txt”的文件,然后上传,打印出来的结果为:

array ( 'content' => array ( 'name' => '��建 文本文档.txt', 'type' => 'text/plain', 'tmp_name' => 'D:\\wamp\\tmp\\php327.tmp', 'error' => 0, 'size' => 10, ), )

很好,乱码了。

通过我各种孜孜不倦的求助搜索引擎,求助好友以及自救之后,一个网页让我豁然开朗。

https://bugs.php.net/bug.php?id=55510

为大家节选一部分

I started going back version by version from 5.3.8 to see where the problem started,
and it seems to have begun with 5.3.7, as 5.3.6 works correctly. Once again,
I'm just replacing PHP builds -- I'm not modifying any else. With 5.3.6, I get back what I would expect: array(1) { ["filename"]=> array(5) { ["name"]=> string(10) "readme.txt" ["type"]=> string(10) "text/plain"
["tmp_name"]=> string(31) "C:\temp\file_upload\php594F.tmp" ["error"]=> int(0) ["size"]=> int(22) } } With 5.3.7 and 5.3.8, I get back the missing first letter: array(1) { ["filename"]=> array(5) { ["name"]=> string(10) "eadme.txt" ["type"]=> string(10) "text/plain"
["tmp_name"]=> string(31) "C:\temp\file_upload\php594F.tmp" ["error"]=> int(0) ["size"]=> int(22) } } With 5.4.beta1-dev, I'm back to getting everything that I expect: array(1) { ["filename"]=> array(5) { ["name"]=> string(10) "readme.txt" ["type"]=> string(10) "text/plain"
["tmp_name"]=> string(31) "C:\temp\file_upload\php594F.tmp" ["error"]=> int(0) ["size"]=> int(22) } }

也就是说是PHP5.3.8存在这个问题,而我检查之后发现,我本机及服务器的PHP版本都是5.8.3,双双躺枪。

两种简单的解决方案:

一.升级你的PHP版本吧。或者后退也行啊。不要用5.3.8了。

二.重命名文件之后再上传吧,我直接用的随机数加当前时间戳再加上文件拓展名。直接绕过文件名被截断的问题。当然,如果需要保存原文件名又不想修改你的PHP环境的话,那你可以放一个hidden存储你的文件名,提交过去或者hidden里面的文件名即可。

PHP上传文件出现文件名被截掉第一个字符的问题的更多相关文章

  1. Django和Ueditor自定义存储上传文件的文件名

    django台后默认上传文件名 在不使用分布式文件存储系统等第三方文件存储时,django使用默认的后台ImageField和FileField上传文件名默认使用原文件名,当出现同名时会在后面追加下随 ...

  2. php上传文件中文文件名乱码的解决方法

    文件上传是我们在处理表单提交时候最常用的功能之一,今天写了一个小小的demo,如下: 先看结构: html为表单提交的页面,php为处理表单的文件,upload为上传文件所放的位置 html: < ...

  3. C# 获取上传文件的文件名和后缀名

    //获得要上传的文件 HttpPostedFile file = Request.Files[]; //获得到文件名 string fileName = System.IO.Path.GetFileN ...

  4. django 自定义存储上传文件的文件名

    一.需求: Django实现自定义文件名存储文件 使文件名看起来统一 避免收到中文文件导致传输.存储等问题 相同的文件也需要使用不同的文件名 二.实现思路: 思路: 生成14位随机字母加数字.后10位 ...

  5. Linux系统下curl命令上传文件,文件名包含逗号无法上传

    使用curl命令,将备份好的图片全部重新导入到seaweedfs,图片全部以存储在seaweedfs中的fid命令, fid中间有一个逗号,使用curl命令时报错: curl: (26) couldn ...

  6. 上传文件中文文件名乱码的解决方法以及iconv函数的使用

    http://www.jb51.net/article/14530.htm 一般客户端是什么格式就展示什么格式,比如浏览器的UTF-8,windows的GBK

  7. nodejs express 上传文件自定义文件名和上传路径

    1.客户端 <form action="http://localhost:3000/profile" method="post" enctype=&quo ...

  8. struts文件上传,获取文件名和文件类型

    struts文件上传,获取文件名和文件类型   Action中还有两个属 性:uploadFileName和uploadContentType,这两个属性分别用于封装上传文件的文件名.文件类型.这是S ...

  9. 上传文件,经过Zuul,中文文件名乱码解决办法

    转载请标明出处: http://blog.csdn.net/forezp/article/details/77170470 本文出自方志朋的博客 问题描述 在项目中又一个上传文件的oss服务,直接调用 ...

随机推荐

  1. WIN8.1 PROBLEMS 01

    win8装好后右下角显示secureboot未正确配置桌面会显示“Windows 8.1 Secure Boot未正确配置”的水印问题: 安全启动(Secure Boot)可以阻止未授权软件的运行,提 ...

  2. Appcelerator Titanium 3.x Win7 64位平台安装步骤

    刚接触Android移动开发,第一次下载Titanium,第一次下载ADT,第一次看Javascript代码,N多第一次...... 慢慢摸索了一个礼拜把移动开发的工具链的配置学习了一下,抛砖引玉,但 ...

  3. redis 控制调用频率

    redis提供了rate limit demo 如下所示: INCR key Available since 1.0.0. Time complexity: O(1) Increments the n ...

  4. struts2,hibernate,spring整合笔记(1)

    今天终于配置好了ssh框架的整合,记录下过程供参考 环境:window8.1,jdk1.7 ,带有javaee的eclipse,也就是说要能发布web项目,TOMCAT服务器,tomcat配置涉及到环 ...

  5. 通知中心 NSNotificationCenter

    NSNotificationCenter 通知中心提供了一种在程序内广播信息的途径,一个NSNotificationCenter对象本质上是一个通知分发表(notification dispatch ...

  6. ASP.NET MVC 文件异步上传问题处理

    最近在做一个网站,用asp.net MVC4.0来开发,今天遇到了个小问题,通过查找相关渠道解决了,在这里把这个问题写出来,问题非常简单,不喜勿喷,mark之希望可以给遇到相同问题的初学者一点帮助.我 ...

  7. linux 网络状态工具ss命令

    ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix dom ...

  8. java中的异常机制(编译时异常)

    / * 1 异常机制的原理 * 异常是什么:就是错误的另外一种说法; * 在java中,有一个专门模拟所有异常的类,所有的异常都必须继承这个类:Throwable; * 本质是:当程序出错以后,jvm ...

  9. mysql慢查优化总结

    1.优化sql语句结构 or改成union,使用start,limit 先只查询出所有的id,然后再排序.如果查询出所有的id仍然很慢,就要仔细考虑了. 2.添加索引 mysql每次查询只能使用一个索 ...

  10. 解决:debug-stripped.ap_' specified for property 'resourceFile' does not exist.

    1.错误描述 更新Android Studio到2.0版本后,出现了编译失败的问题,我clean project然后重新编译还是出现抑郁的问题,问题具体描述如下所示: Error:A problem ...