【问题标题】:Getting the system date created of a file using PHP使用 PHP 获取创建文件的系统日期
【发布时间】:2016-03-31 15:56:38
【问题描述】:

编辑

我现在有这个 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 页面。

【问题讨论】:

  • 有错误吗?你打开error reporting了吗?
  • 是的,它已经在代码中了

标签: php file-upload


【解决方案1】:

解决方案:

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

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

进一步澄清:

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

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

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

如果此信息可从文件中获得,则它存储在文件本身内的所谓“元数据”中,要访问这些元数据位,您需要使用类似 @987654323 的东西@ 图片。


或者,如果您只是想要将文件添加到系统的日期,您可以阅读in this 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 正试图从非文件实体获取数据。

【讨论】:

  • 我现在正在使用filectime,但仍然没有结果
  • 我需要在更改其目录之前阅读它的创建日期
  • 您的问题的答案在我的 anwser 的 NOTES 部分。您从 $_FILES 调用了错误的值。 @androidnation
  • 有效,但它给了我今天的日期,我需要他们自己的日期才能被我的 PHP 代码移动
  • sigh,那么请参考我最初关于从图像文件本身获取元数据的声明。 @androidnation
【解决方案2】:

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

这不是 PDO 文档。

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

用户可以在他们的本地机器上看到修改时间。如果他们无法提供此信息,那么唯一的选择是备份文件,将其还原到您的服务器上(使用不更改 mtime 的适当方法,例如以 root 身份解压缩)然后直接从而不是通过网络上传。

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2016-11-20
    • 2016-12-09
    相关资源
    最近更新 更多