我有一个php的fileupload,但这是无关紧要的,因为我真正的问题是我有以下代码:
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()
));
}THe文件被上传,我正在从实际的时间戳和真实的文件名创建一个sha1散列。在我用substr()对它们进行裁剪之后,这里有个棘手的部分。mkdir不是用截断的字符串创建目录,而是用奇怪的另一种组合。我不知道我做错了什么。你能帮我看一下吗?
发布于 2013-03-18 07:10:42
$rand2 = sha1(sha1($real.$time),0,4);
这应该是$rand2 = substr(sha1($real.$time),0,4); #RAND2
并且请删除$do = ;
在"dev mod“下,
会显示一个错误:警告: sha1()最多需要2个参数,给定3个
只是你有一个打字错误或类似的东西
我用这样的代码在我的本地服务器上做了一个快速检查,它可以工作
<?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>您可以检查它,但问题是应该用substr替换您的sha1函数
更新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',依此类推。
在我看来,下面的部分会让你更清楚地了解它(注意负面的部分)
如果给定长度并且长度为正,则返回的字符串将包含从开始开始的最大长度字符(取决于字符串的长度)。
如果长度是给定的,并且是负数,那么从字符串的结尾将省略这些字符(在开始位置为负数的情况下计算出开始位置之后)。如果start表示此截断的位置或更远,将返回false。
https://stackoverflow.com/questions/15467358
复制相似问题