You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地文件与Dropbox托管文件的修改日期校验问题

如何获取Dropbox托管文件的修改日期?

问题背景

我能通过以下代码成功获取本地文件的修改日期:

<?php 
    $filename = 'db/ciupercomania.db';
    if (file_exists($filename)) {
        echo "This database was created on: <b>".date("F d Y H:i:s.", filemtime($filename)) . "</b><br/><br/>";
    } else {
        echo "File not exist.";
    }
?>

但无法获取Dropbox托管文件的修改日期,使用的代码如下:

<?php
    $filename = 'https://www.dropbox.com/home/ciupercomania/Android_db?preview=Ciupercomania.db';
    if (file_exists($filename)) {
        echo "Out there is a database created on: <b>".date("F d Y H:i:s.", filemtime($filename)) . "</b><br/><br/>";
    } else {
        echo "File not exist.";
    }
?>

我尝试过使用filectime,以及带有?dl=0和?dl=1参数的Dropbox链接,但均未成功。针对Dropbox链接,始终收到「FILE NOT EXIST」提示;若不输出该提示,则会收到警告:Warning: filemtime(): stat failed for https://www.dropbox.com/home/ciupercomania/Android_db?preview=Ciupercomania.db


已尝试的方案

了解到filemtime()仅适用于同一服务器上的文件后,我尝试用curl_getinfo()和get_headers()替代,代码如下:

cURL方案

<?php
  $url = 'https://www.dropbox.com/home/ciupercomania/Android_db?preview=Ciupercomania.db';
  $curl = curl_init($url);

  // 仅获取响应头
  curl_setopt($curl, CURLOPT_NOBODY, true);
  // 不输出到标准输出
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  // 尝试获取文件修改时间
  curl_setopt($curl, CURLOPT_FILETIME, true);

  // 禁用SSL验证(不推荐)
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

  // 检查错误
  if(curl_errno($curl)){
    throw new Exception(curl_error($curl));
  }

  $result = curl_exec($curl);

  $timestamp = curl_getinfo($curl, CURLINFO_FILETIME);
  if ($timestamp != -1) {
    echo date("Y-m-d H:i:s", $timestamp); 
  } 
?>

get_headers方案

<?php
  $url = 'https://www.dropbox.com/home/ciupercomania/Android_db?preview=Ciupercomania.db';
  $h = get_headers($url, 1);

  $dt = NULL;
  if(!$h || strpos($h[0], '200') !== false){
    $dt = new \DateTime($h['Last-Modified']);
    echo $dt;
  }
?>

起初遇到SSL验证错误,尝试过忽略验证或指定证书路径,现在无报错但依然无法获取结果。


解决方法

1. 使用正确的Dropbox直接文件链接

你当前使用的是Dropbox网页预览链接(/home/...),这类链接返回的是网页内容而非文件本身,无法获取文件的Last-Modified响应头。需切换为直接文件链接:

  • 在Dropbox中找到目标文件,点击「分享」→「创建链接」→「复制链接」
  • 将链接中的dl=0替换为raw=1(或dl=1),得到类似https://www.dropbox.com/s/xxx/Ciupercomania.db?raw=1的链接,该链接直接指向文件资源。

2. 修复cURL代码(推荐)

使用正确的直接链接,同时建议保留SSL验证以确保安全:

<?php
$url = 'https://www.dropbox.com/s/xxxx/Ciupercomania.db?raw=1'; // 替换为你的直接文件链接
$curl = curl_init($url);

curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FILETIME, true);
// 配置CA证书(从curl官方下载cacert.pem到项目目录)
curl_setopt($curl, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');

if(curl_errno($curl)){
    die(curl_error($curl));
}

curl_exec($curl);

$timestamp = curl_getinfo($curl, CURLINFO_FILETIME);
curl_close($curl);

if ($timestamp !== -1) {
    echo "文件修改日期:" . date("Y-m-d H:i:s", $timestamp);
} else {
    echo "无法获取修改日期";
}
?>

3. 修复get_headers代码

修正逻辑错误并使用直接文件链接:

<?php
$url = 'https://www.dropbox.com/s/xxxx/Ciupercomania.db?raw=1'; // 替换为你的直接文件链接
$h = get_headers($url, 1);

$dt = null;
// 修正逻辑:确保请求成功且存在Last-Modified头
if($h && strpos($h[0], '200') !== false && isset($h['Last-Modified'])){
    $dt = new DateTime($h['Last-Modified']);
    echo "文件修改日期:" . $dt->format("Y-m-d H:i:s");
} else {
    echo "无法获取修改日期";
}
?>

补充说明

  • 若仍遇SSL问题,可从官方渠道下载cacert.pem,避免禁用SSL验证带来的安全风险。
  • Dropbox的网页预览链接不会返回文件的Last-Modified头,必须使用直接指向文件的链接。

内容的提问来源于stack exchange,提问作者Szabolcs H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 01:55:35