正在检查表单中提交文件的时间


Checking time of submitting file in form

我想要一个HTML表单,由用户将文件发送到我的服务器。我需要知道他开始发送这个文件的确切时间,而不是收到文件的时间(我可以检查收到的时间,例如在服务器上检查文件修改时间)。这个代码应该这样做——当点击"提交"时,当前服务器时间应该写入logsForSendingForm.txt,当文件接收时,时间应该写入logsForReceivedForm.txt。不幸的是,在发送文件时,只有收到文件的时间会写入logsForReceivedForm.txt,而没有任何内容写入logsFor ReceivedFormtxt。有趣的是,如果我没有选择任何文件并单击"提交",则当前时间将写入这两个文件。

如果你不知道如何调试,但你可以建议任何其他解决方案(可能没有AJAX),也可以,我不需要像在这段代码中那样做。

<?php
if (isset($_POST['tickStart']))
{
    file_put_contents('logsForSendingForm.txt', time() . "'n", FILE_APPEND);
}
elseif (!empty($_FILES))
{
    file_put_contents('logsForReceivedForm.txt', time() . "'n", FILE_APPEND);
    $f = $_FILES['file'];
    $patch = str_replace('index.php', '', $_SERVER['SCRIPT_FILENAME']);
    copy($f['tmp_name'], $patch.$f['name']);
}
?><!DOCTYPE html>
<html>
    <head>
        <script src='http://code.jquery.com/jquery-2.1.0.min.js'></script>
        <script type='text/javascript'>
                function sending()
                {
                    $.ajax({
                        url: 'index.php',
                        type: 'POST',
                        data: { tickStart: true }
                    });
                    return true;
                }
        </script>
    </head>
    <body>
        <form action='index.php' method='post' enctype='multipart/form-data'>
            <input type='file' name='file'><br>
            <input type='submit' name='submit' value='Submit' onsubmit="return sending()">
        </form>
    </body>
</html>

您需要进行更多的检查,但这里有一些经过简短测试的代码。我使用了microtime()而不是时间,因为对于小文件,在本地主机上的秒数没有差异。例如,我还在这里添加了一些内容,以帮助通知用户他们的文件太大。你可能想根据哑剧的类型来捕捉,并通知他们。。。

我抛弃了Jquery,因为它似乎是多余的。

如果(以及何时)多个客户端尝试写入日志,您可能仍然会得到损坏的文件。(这就是为什么我在你的追加中添加了|LOCK_EX标志。我没有做任何负载测试,所以不能保证。)数据库???

否则,您可能还需要进行一些文件名规范化,以消除非法/非ascii字符。但这是另一个在其他地方得到处理的问题。

干杯。

编辑:持续时间:0.084668874740601(对于localhost上的23mb文件)持续时间:0.0021710395812988(对于本地主机上的74k文件)

<?php
    if (isset($_POST['tickStart']))
    {   
        // this is the moment the script began 
        $mtime1=$_SERVER['REQUEST_TIME_FLOAT'];
        $log = 'sent: ' . $mtime1;
    }
    if(isset($_SERVER['REQUEST_METHOD']) && strtolower($_SERVER['REQUEST_METHOD']) == 'post' && $_FILES['file']['size'] == 0){ 
        $postMax = ini_get('post_max_size'); 
        $fileMax = ini_get('upload_max_filesize');  
        $message = "Max filesize: $fileMax<br>Max postsize: $postMax";
        $log = 'file too large';
    }
        elseif (!empty($_FILES) && !empty($_POST) && $_FILES['file']['size'] > 0)
    {
        $f = $_FILES['file'];
        $patch = str_replace('index.php', '', $_SERVER['SCRIPT_FILENAME']);
        copy($f['tmp_name'], $patch.$f['name']);
        // this is the time NOW
        $mtime2=microtime(true);
        file_put_contents('logsForSendingForm.txt', $mtime1 . "'n", FILE_APPEND  | LOCK_EX);
        file_put_contents('logsForReceivedForm.txt', $mtime2 . "'n", FILE_APPEND  | LOCK_EX);
        $duration = $mtime2 - $mtime1;
        $log = $log . ''nduration: '.$duration;
        $message = $f['name'].' uploaded.';
    }
        else 
    {
        $log = 'no file selected';
        $message = 'Please choose a file.';
    }
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <script type='text/javascript'>
            console.log('<?php print $log ?>');
        </script>
    </head>
    <body>
        <form action='index.php'  enctype='multipart/form-data' method='POST'>
            <input type='file' name='file'><br>
            <input type='hidden' value='true' name='tickStart'>
            <input type='submit' name='submit' value='Submit'>
        </form>
        <h2>
        <?php print $message; ?>
        </h2>
    </body>
</html>