php explode() bug(php 图片上传有个小BUG,求大神解答以下是我的一些代码)

本文目录
php 图片上传有个小BUG,求大神解答以下是我的一些代码
您好,这个是 PHP 的一个 BUG(毕竟是外国人做的,中文支持不太好)。
PHP 中,上传中文文件基本上都会出错,所以只要在移动文件时,将文件重命名就可以了。
(如果需要原文件名,只需要将原文件名和重命名后的文件名保存在数据库中就可以了)
代码如下(您的代码有一些漏洞与不规范之处,这里已更正):
// 检测文件MIME类型,如果不是图片则阻止本次上传
// 不要相信$_FILES,这是可以伪造的
// 如果 PHP 》= 5.3.0,则使用finfo函数来获取文件类型
// 因为 PHP 》= 5.3.0 放弃了 mime_content_type() 函数
if (version_compare(PHP_VERSION, ’5.3.0’, ’》=’)) {
$f = finfo(FILEINFO_MIME_TYPE);
$ftype = explode(’/’, finfo_file($f, $_FILES));
finfo_close($f);
$f = NULL;
if ($ftype !== ’image’) {
@unlink($_FILES);
die(’文件上传失败!《br /》请重新上传。《br /》《a href="pfabu.html"》返回《/a》’);
}
$ftype = NULL;
}
else {
$ftype = explode(’/’, mime_content_type($_FILES));
if ($ftype !== ’image’) {
@unlink($_FILES);
die(’文件上传失败!《br /》请重新上传。《br /》《a href="pfabu.html"》返回《/a》’);
}
$ftype = NULL;
}
$link = mysql_connect(’localhost’,’root’,’123456’);
mysql_query(’set names \’UTF8\’’);
mysql_select_db(’zhenyu’, $link);
// 为了防止SQL注入,对数据进行转义
$pkind = addslashes($_POST);
$pname = addslashes($_POST);
$pshow = addslashes($_POST);
$filename_upload = $_FILES;
// Base64 编码后的字符只含有 a-z A-Z 0-9 以及+,/,=
$filename = base64_encode($filename_upload);
// Base64 编码中有一些非文件名可用的字符,把它们替换掉
$filename = strtr($filename, array(
’+’ =》 ’.’,
’/’ =》 ’_’,
’=’ =》 ’-’
)
);
// 上传后的文件保存在product文件夹
$file_move = ’product/’ . $filename;
// 如果文件已存在,则在文件名后加上-和一个随机数
// 当然,这一部分也可以您自己更改,不会影响结果
if(file_exists($file_move)) {
$rand = ’-’ . strval(rand(0, 9999));
$file_move .= $rand;
$filename_upload .= $rand;
// 因为 $rand 被其它变量引用,不能直接注销
// 所以将其赋值为 NULL,也可达到同样的释放内存的效果
$rand = NULL;
}
// 判断文件是否是通过 HTTP POST 上传的
// 这可以用来确保恶意用户无法欺骗程序去访问本不该访问的文件,例如/etc/passwd
if (!is_uploaded($_FILES)) {
@unlink($_FILES);
die(’文件上传失败!《br /》请重新上传。《br /》《a href="pfabu.html"》返回《/a》’);
}
// 如果文件移动失败,则显示错误信息
// 这样就不会导致数据库存储正常,但文件上传失败的情况了
elseif (!move_uploaded_file($_FILES, $file_move)) {
@unlink($_FILES);
die(’文件上传失败!《br /》请重新上传。《br /》《a href="pfabu.html"》返回《/a》’);
}
// 这里将重命名后的文件名与原文件名储存在同一个字段中,用竖线(|)隔开
// 读取时只需要用 explode() 分开就可以了
if($mysql = mysql_query("INSERT INTO product(pkind,pname,ppicture,pshow) VALUES(’{$pkind}’,’{$pname}’,’{$file_move}|{$_FILES}’,’{$pshow}’)")) {
// 显示文件上传信息
echo ’Upload: ’, $filename_upload, ’《br /》’;
echo ’Size: ’, strval($_FILES / 1024.0), ’ KB《br /》’;
echo ’Stored in: ’, $file_move, ’《br /》’;
echo ’《a href="pfabu.html"》返回《/a》’;
echo ’《script》alert("success");《/script》’;
}
// 如果存入数据库时失败
// 则显示错误信息
else {
@unlink($_FILES);
die(’文件上传失败!《br /》请重新上传。《br /》《a href="pfabu.html"》返回《/a》’);
}
这样就可以了。
由于没有测试,代码难免会出现一些错误,请随意指出,谢谢!
另外,您还应该考虑到不同用户上传同一个文件名的文件的情况,最好是为每个用户单独分配一个文件夹。
而且,当一个文件夹下的文件过多(》300)时,会导致读写速度变慢,这一点要注意。
解决:
当一个用户的文件夹下文件有300个时,用户再上传文件,就将新的文件保存在另一个文件夹中(如:用户名加上这个用户已有的文件夹数量)。
如果还有后续问题,可以联系我的邮箱:
blutrex@gmail.com
谢谢!
PHP explode为什么失败
你的$_FILES这个文件肯定打开失败了,禅慎启原因诸如文件域孝塌名字用错啦、form表单的enctype没有设置成"multipart/form-data"啦等等。
关于PHP fgets和explode
经我测试确实有错!
我把下面的函数改了一下你看看,你写的有源败一点错误!当函数中遇到return时.此函数就跳出不再执行了!相当于你写了个exit;所以你如果文本中有两个以上的用户名,第二雹租颤个用型腔户名永远检测不到.
改过后测试可用
function checkPasswd($passwd,$user){
$flag=false;
if(!$fh = fopen("passwd.txt", "r")) return false;
while(!feof($fh)){
$line = trim(fgets($fh));
//your code goes below this line
$x = explode(":",$line);
if($user == $x)
{
$flag=true;
break;
}
else
{
$flag=false;
}
}
fclose($fh);
return $flag;
}

更多文章:
coherent词根词缀(英语单词词根专题:co com con)
2025年12月7日 07:15
java多线程有并行吗(java线程可以在运行在多个cpu核上吗)
2026年4月10日 03:45
protected与private的区别(VC++中的public,private,protected的区别,说得通俗点)
2026年8月25日 22:45
declaration是什么意思英语(declaration和statement有什么区别)
2025年10月8日 14:00
matlab将x值代入方程求y值(matlab已知直线和x值,如何求y值)
2026年6月28日 23:15
the executive是什么意思(executives和leaders的区别)
2026年2月3日 06:15
php图片显示不出来(图片前面有img.phpurl=导致图片不显示)
2025年11月24日 16:15
最近在线直播免费观看回放漫画网页(51漫画官方在线阅读页面免费漫画入口页面)
2025年10月19日 06:45
subplot括号里的数字(EXCEL里面SUBTOTAL(9,O5:O138)括号里面的“9”代表什么)
2025年11月16日 23:45
持续集成系统搭建(iOS持续集成(Jenkins+xcode插件))
2025年6月23日 16:45
java毕业论文参考文献(做毕业设计,求java类近几年的参考文献)
2025年12月9日 19:30
matlab下载与安装教程(matlab2018b破解版安装教程)
2025年9月26日 23:00










