0

我有一个用 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 不是用剪切的字符串而是用另一种奇怪的组合创建目录。我不知道我做错了什么。你能看一下吗?

4

1 回答 1

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 为非负数,则返回的字符串将从字符串的第 start 位置开始,从零开始计数。例如,在字符串 'abcdef' 中,位置 0 的字符是 'a',位置 2 的字符是 'c',等等。

在我看来,下面的部分会让你更加清醒(注意负面部分)

如果给出了长度并且是正数,则返回的字符串将最多包含从 start 开始的 length 个字符(取决于字符串的长度)。

如果给定长度并且为负数,那么将从字符串末尾省略很多字符(在开始位置为负数时计算开始位置之后)。如果 start 表示此截断的位置或超出该位置,则将返回 false。

于 2013-03-17T23:10:41.567 回答