Javascript 检查表单中提交文件的时间
我想有一个HTML表单发送一个文件到我的服务器由用户。我需要知道他开始发送此文件的确切时间,而不是收到文件的时间(我可以通过检查服务器上的文件修改时间来检查收到的时间)。此代码应做到这一点-单击“提交”时,当前服务器时间应写入LogsForEndingForm.txt,文件收到时间时,应写入LogsForReceiveForm.txt。 不幸的是,在发送文件时,只有收到文件的时间才会写入logsForReceivedForm.txt-没有任何内容写入logsForReceivedForm.txt。 有趣的是,如果我没有选择任何文件并单击Submit,那么当前时间将写入这两个文件 如果您不知道如何调试它,但是您可以建议任何其他解决方案(可能没有AJAX),这也没关系,我不需要在代码中这样做Javascript 检查表单中提交文件的时间,javascript,php,jquery,html,ajax,Javascript,Php,Jquery,Html,Ajax,我想有一个HTML表单发送一个文件到我的服务器由用户。我需要知道他开始发送此文件的确切时间,而不是收到文件的时间(我可以通过检查服务器上的文件修改时间来检查收到的时间)。此代码应做到这一点-单击“提交”时,当前服务器时间应写入LogsForEndingForm.txt,文件收到时间时,应写入LogsForReceiveForm.txt。 不幸的是,在发送文件时,只有收到文件的时间才会写入logsForReceivedForm.txt-没有任何内容写入logsForReceivedForm.txt
<?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>
函数发送()
{
$.ajax({
url:'index.php',
键入:“POST”,
数据:{tickStart:true}
});
返回true;
}
您需要做更多的检查,但这里有一些经过简单测试的代码。我使用microtime()而不是time,因为对于小文件,本地主机上的秒数没有差别。例如,我还从中插入了一些内容,以帮助通知用户他们的文件太大。您可能希望根据mime类型捕获并告知他们这一点
我抛弃了Jquery,因为它似乎是多余的
如果(以及当)多个客户端试图写入您的日志,您可能仍然会得到一个损坏的文件。(这就是为什么我在你的append中添加了| LOCK_EX标志。我没有做任何负载测试,所以没有保证。)数据库
否则,您可能还需要进行一些文件名规范化,以消除非法/非ascii字符。但这是另一个在其他地方被处理过的问题
干杯
编辑:
持续时间:0.084668874740601(对于本地主机上的23mb文件)
持续时间:0.002171395812988(对于本地主机上的74k文件)
控制台日志(“”);
你就不能滑动一个var startime=new Date();在Ajax调用之前的某个地方,并将其传递给服务器?@TimSPQR,这将从用户的计算机传递时间,而不是服务器的时间,对吗?我需要这是服务器时间,所以没有人可以“作弊”。并发性会有一个大问题,因为对同一个文件多次“同时”调用file\u put\u内容可能会损坏它。如果用户提交时不能使用js,那么php代码的第一行就需要是“now”时间变量,然后在保存所有其他用户数据库内容时将其保存到表中。不起作用。。。文件上载时间约为30秒,但发送时间和rcvd时间之间的差异为0.001,在上载此文件后,它只检查了两次。我认为它不起作用,因为这个隐藏的输入是在文件发送完成的同时发送的。顺便说一句,你真的应该为你的上传系统使用一些东西,比如这里的答案:如果更改对你有效,你应该将这个问题标记为已回答。我测试了这个,它在localhost上运行良好。但是当上传到远程FTP服务器时(我在两个不同的服务器上进行了测试),持续时间总是非常小,比如0.001,即使我上传文件半分钟左右。发送时间是文件已完全发送的时间。你知道哪里出了问题吗?
<?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>