本地文件与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
相关产品推荐
相关产品推荐

