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

时间:2016-03-31 15:56:38

标签: php file-upload

修改

我现在有这个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文档in this link访问日期。

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

2 个答案:

答案 0 :(得分:1)

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

这不是PDO文档。

上传的文件是原始文件中保存的数据的副本 - 因此您在副本上看到的mtime将始终是“现在”。

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

答案 1 :(得分:1)

<强> SOLUTION:

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

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

进一步澄清:

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

元数据是关于某事的数据,通常关于文件的数据(例如其创建日期)不作为标准存储在文件本身中,而是存储文件的操作系统中内容。

接收上传文件的服务器无法告诉您何时将文件保存到其来自的计算机上,或其他任何与文件系统相关的内容,因为服务器仅获得了文件内容数据,不是关于存储和修改(等)的文件系统元数据

如果此信息可从文件中获得,则它存储在文件本身内部的“MetaData”中,要获取这些元数据,您需要使用{{{ 1}}用于图像。

或者,如果您只想将文件添加到系统的日期,则可以阅读in this Stack Answer

备注:

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

您的问题(来自您的评论)是您正在寻找而不是文件的字符串的时间。将move_uploaded_file来电中的$_FILES["image_file"]["name"]替换为filectime,因为这是(临时)存储上传文件的位置地址。

['tmp_name']中的name数组值只是告诉您上传文件的名称。

但是 这一次只会告诉您上传的时间。

  • 您的错误日志应该向您显示您的$_FILES正在争夺从非文件实体获取数据。