获取使用PHP创建的文件的系统日期


Getting the system date created of a file using PHP

编辑

我现在有这个PHP代码:

$name = isset($_POST['image_file']) ? $_POST['image_file'] : '';
            $date_added = date ("F d Y H:i:s.", filectime(basename($_FILES["image_file"]["tmp_name"])));
            $path = "../uploads/".basename($_FILES["image_file"]["name"]);
            $patient_id = $_POST['patient_id'];
            $remark = $_POST['remark'];
            //$date_added = $_POST['date_added'];

            $ext = pathinfo($path, PATHINFO_EXTENSION);
...

任何文件(图像除外)的结果为:January 01 1970 01:00:00.

当我尝试上传图像时,它会将我发送到一个空页面,在那里不会显示错误,图像也不会上传到文件夹中。

结束编辑

我需要使用以下表格将扫描图像添加到患者文件中:

<form enctype="multipart/form-data" id="myForm" name="myForm" action="add_scan.php" method="post">
            <div class="box-body" id="toggleDiv">
              <div class="row">
                <div class="col-md-6">
                  <div class="form-group">
                    <label style="float:left">File Description</label>
                    <input type="text" class="form-control" id="remark" name="remark"/>                        
                    <label style="float:left">Upload File</label>
                    <input type="file" class="form-control" id="image_file" name="image_file"/>
                    <input type="hidden" class="form-control" id="patient_id" name="patient_id" value="<?php echo $patient_id ?>"/>
                  </div><!-- /.form-group -->
   <button type="submit" class="btn btn-warning" id="add_scan" name="add_scan">Add File</button>
</form>

通常,我的客户会添加一个日期,但有时他会忘记照片拍摄的日期。所以我需要访问图像的系统日期。

我尝试了以下操作:Add_scan.php页面:

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
require_once('../include/global.php');
//session_start();
$user = $_SESSION['username'];
$id_logged = $_SESSION['login_id'];
if(isset($_POST['add_scan']))
    {
    try
    {
        $name = isset($_POST['image_file']) ? $_POST['image_file'] : '';
        $path = "../uploads/".basename($_FILES["image_file"]["name"]);
        $date_added = date ("Y-m-d", filectime(basename($_FILES["image_file"]["name"])));
        $patient_id = $_POST['patient_id'];
        $remark = $_POST['remark'];
        //$date_added = $_POST['date_added'];

        $ext = pathinfo($path, PATHINFO_EXTENSION);
        move_uploaded_file($_FILES["image_file"]["tmp_name"], $path.$name);
        $sqlUpd = "INSERT INTO scan_image(id_logged, patient_id, image_file, remark, date_added)
                   VALUES(:id_logged, :patient_id, :image_file, :remark, :date_added)";
        $stmt = $conn->prepare($sqlUpd);
        $stmt->bindValue(':id_logged', $id_logged);
        $stmt->bindValue(':patient_id', $patient_id);
        $stmt->bindValue(':image_file', $path);
        $stmt->bindValue(':remark', $remark);
        $stmt->bindValue(':date_added', $date_added);
        $stmt->execute();
        header("Location: patients.php?patient=".$patient_id);
    }
    catch(PDOException $e)
    {
        echo $e->getMessage();
    }
?>

我使用这一行:$date_added = date ("Y-m-d", basename($_FILES["image_file"]["name"]));根据这个链接中的PHP PDO文档访问日期。

但没有添加任何内容,我只看到我的add_scan.php代码的空白页,并且它没有重定向到patient.php页面。

解决方案:

因为您正在上传文件,所以系统上的日期将是上传日期。如果是图像文件,您的解决方案是读取图像文件元数据,这有点痛苦,因为每种类型的图像文件都有多种类型的元数据,而找到您想要的元数据本身并不高效。

我认为Imagick PHP插件可以做到这一点,但我不能保证这个/这些函数的质量或价值。

进一步澄清:

当您将文件从计算机上载到服务器时,服务器将保存有关计算机上文件的NO文件系统信息。

Meta-Data是关于某些东西的数据,通常关于文件的数据(如创建日期)不会作为标准存储在文件本身中,而是存储在存储文件内容的操作系统中。

接收上载文件的服务器无法告诉您该文件何时保存到其来源的计算机或任何其他与文件系统相关的文件,因为服务器只收到了文件内容数据,而不是文件系统关于存储和修改的元数据。

如果此信息可从文件中获得,则它将存储在文件内部的所谓"元数据"中,要访问这些元数据,您需要对图像使用类似Imagick的东西。


或者,如果你只是想知道文件添加到这个系统的日期,你可以在这个Stack Answer中读取。

注意:

  • 您需要filectime
  • header之后,添加一个exit以停止执行
  • 您有一个名称相同的$_POST$_FILES值,您使用的是$_POST['upload_file']$_FILES['upload_file']。我不确定这是否会破坏您的脚本,但它的POST值将为空,除非您的表单中有其他名称相同的字段,这显然是不好的做法
  • 您的require和/或include不需要在括号中
  • pathinfo一个相对路径也是不好的做法,你应该尽可能给PHP函数一个绝对路径,使用$_SERVER['DOCUMENT_ROOT']或其他神奇的常数
  • 删除filectime中的basename,不需要
  • 当使用move_uploaded_file时,看起来$path.$name实际上应该是$path.$name.$ext

你的问题(从你的评论中)是,你在寻找而不是文件的字符串的时间。将filectime调用中的$_FILES["image_file"]["name"]替换为['tmp_name'],因为这是(临时)存储上载文件的位置地址。

$_FILES中的name数组值只是简单地从上传文件的位置"告诉"您文件的名称。

但是 这个时间只会告诉你上传的时间。

  • 您的错误日志应该已经显示您的filectime正在绑定以从非文件实体获取数据

filemtime报告文件修改时间,而不是创建时间(这在大多数操作系统上不可用)。

这不是PDO文档。

上传的文件是原始文件中数据的副本,因此您在副本上看到的时间总是"现在"。

用户可以在本地机器上看到修改时间。如果他们不能提供这些信息,那么唯一的选择就是备份文件,在你的服务器上恢复(使用一种不会改变mtime的适当方法,例如以root身份untar),然后直接从那里加载文件,而不是通过网络上传。