【问题标题】:Weird results with substr and mkdir function in phpphp 中 substr 和 mkdir 函数的奇怪结果
【发布时间】:2013-03-06 05:32:14
【问题描述】:

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

【问题讨论】:

    标签: php file-upload substr mkdir


    【解决方案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 optionalphp.net 的摘录可能会为您清除一切:

    如果 start 为非负数,则返回的字符串将从 字符串中的第一个位置,从零开始计数。例如,在 字符串'abcdef',位置0的字符是'a',位置的字符 位置 2 是“c”,依此类推。

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

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

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

    【讨论】:

    • 我已经删除了$do = ; 部分,但它并没有解决主要问题
    • 三个?为什么?在 php.net 上最多只有 2 个参数。 php.net/manual/en/function.sha1.php
    • 这只是一个错字,现在已更正,看起来像这样$rand1 = substr(sha1($real.$time),0,4); $rand2 = substr(sha1($real.$time),5,-22);,并且有一个参数$real.$time
    • 但事实并非如此,这就是为什么 mkdir 正在创建这样的目录:d8dabb010cfbe 但它应该创建这样的目录:d8dabb 所以,它并没有真正切断字符串或​​其他东西像这样
    • 不,看看$rand2 并将它的 substr 方法参数从5 to -22 更改为您想要的,例如尝试1 and 5
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2017-05-14
    • 2022-11-01
    • 2015-07-12
    相关资源
    最近更新 更多