我有一个带有php的文件上载,但这是无关紧要的,因为我真正的问题是我有这个代码:
if (!empty($_FILES)) {
$tempFile = $_FILES['Filedata']['tmp_name'];
$real = $_FILES['Filedata']['name'];
$finfo = pathinfo($real);
$time = time();
$rand1 = substr(sha1($real.$time),0,4);
$rand2 = substr(sha1($real.$time),5,-22);
$fname = preg_replace("#[^A-Za-z1-9]#","_", $_FILES['Filedata']['name']);
mkdir(UPLOAD_TO."/".$rand2,0777);
$targetFile = UPLOAD_TO."/".$rand2."/".$real;
move_uploaded_file($tempFile,$targetFile);
$query = $db->prepare("INSERT INTO files (realname,filename,extension,filesize,rand1,rand2,uppedby,created) VALUES(:real,:filename,:extension,:filesize,:rand1,:rand2,:uppedby,:created)");
$query->execute(array(
":real" => $real,
":filename" => $fname,
":extension" => $finfo['extension'],
":filesize" => filesize($tempFile),
":rand1" => $rand1,
":rand2" => $rand2,
":uppedby" => $_SERVER['REMOTE_ADDR'],
":created" => time()
));
}
文件已上传,我正在从实际时间戳和真实文件名创建sha1哈希。在我用substr()
切割它们之后,但是有一个棘手的部分。 mkdir创建的目录不是带有cutted字符串,而是带有奇怪的其他组合。
我不知道我做错了什么。你能看一下吗?
答案 0 :(得分:1)
$rand2 = sha1(sha1($real.$time),0,4);
这应该是$rand2 = substr(sha1($real.$time),0,4);
#RAND2
请删除$do = ;
Under "dev mod" an error would show up: Warning: sha1() expects at most 2 parameters, 3 given
只是你有一个错字或类似的东西
我使用此类代码快速检查了我的本地服务器,并且可以正常运行
<?php
DEFINE('UPLOAD_TO',"C:/env/php/www/tests/");
if (!empty($_FILES))
{
$tempFile = $_FILES['Filedata']['tmp_name'];
$real = $_FILES['Filedata']['name'];
$finfo = pathinfo($real);
$time = time();
$rand1 = substr(sha1($real.$time),0,4);
$rand2 = substr(sha1($real.$time),5,-22);
$fname = preg_replace("#[^A-Za-z1-9]#","_", $_FILES['Filedata']['name']);
mkdir(UPLOAD_TO."/".$rand2,0777);
$targetFile = UPLOAD_TO."/".$rand2."/".$real;
move_uploaded_file($tempFile,$targetFile);
}
?>
<form method="POST" enctype="multipart/form-data" action="">
<input type="file" name="Filedata" />
<input type="submit" />
</form>
你可以检查一下,但问题是你的sha1
函数应由substr
替换
更新2
由于您的文件夹名称存在问题且对其名称不满意,您可以尝试将$rand2 = substr(sha1($real.$time),5,-22);
更改为$rand2 = substr(sha1($real.$time),1,5);
在php.net substr阅读一本substr手册,并根据您的需要进行阅读,顺便说一句,这是非常基础的。
substr的三个参数是$STRING, $START and $LENGTH which is optional
。 php.net
的摘录可能会为您清除所有内容:
如果start为非负数,则返回的字符串将从 字符串中的起始位置,从零开始计数。例如,在 字符串'abcdef',位置0的字符是'a',字符位于 位置2是'c',依此类推。
在我看来,以下部分会清楚你的想法(注意消极部分)
如果给出length并且为正数,则返回的字符串将包含 从开始开始的最多长度字符(取决于 字符串长度。)
如果给出长度并且为负数,则会有多个字符 从字符串的末尾省略(在起始位置之后) 当开始为负时计算)。如果开始表示的位置 这个截断或超出,将返回false。