PHP 文件名和扩展名恢复


PHP file name and extension restoration

我在一个目录中有一堆文件,其中有随机的 16 位文件名,没有文件扩展名,例如 'RTSWZci59BqXDqaV'

有一个数据库,通过各种调用和关系,我可以找到文件的原始名称,扩展名和内容类型。"原始",因为这些文件都曾经是通过网站上传到服务器的文件(我没有构建)。

我编写了一小段代码来循环访问文件并将它们全部重写为原始文件名和扩展名。这在一定程度上有效,因为.txt文件都可以工作,但PDF/word文档已损坏,图像被打乱/模糊/颜色不佳。

这些文件绝对不是这样

网站的一部分仍然是下载单个文件:

header('Cache-Control: no-cache, must-revalidate');
header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');
header('Pragma:');
header('Content-type: '.$originalContentType);
header('Content-Disposition: attachment; filename="'.$originalFileName'].'.'.$originalExt'].'"');
header('Content-Length: '.filesize(FILE_FOLDER.$fileName));
readfile(FILE_FOLDER.$fileName);

我尝试将每个文件转换回可用内容的代码是一些数据库内容,一些循环,然后是这个:

@rename($directory.$fileName, $directory.$originalFileName.'.'.$originalExt);

我也尝试过使用 copy(),甚至无法通过设置标题来下载单个文件。

有什么明显的事情让我应该在这里做不同的事情吗?上传图像时是否发生了其他编码?将这些文件从服务器中取出后,我可以对它们执行任何操作吗?

文件的名称不能使其损坏,除了尝试使用错误的程序/导入过滤器打开它(例如,尝试将JPEG作为Word文档打开,反之亦然)。

如果图像看起来几乎正确,那么听起来好像发生了一些数据损坏,并且您拥有正确的文件名,但没有正确的内容。

我假设您从以前的某个位置导出了它们,这就是为什么它们有虚拟名称的原因?也许在此过程中,文件已被截断为特定大小,或者遇到 NULL 字节的位置。或者,某些字节可能已被解释为某些特定文本编码中的字符,而不是按原样复制。

如果它们位于数据库中,则可能是使用不是为处理二进制数据而设计的驱动程序或查询类型选择它们。

我最终只是复制了我在示例中描述的单标头下载方法,一些JS每隔几秒钟通过浏览器下载下一个文件。

到目前为止,这不是最优雅的解决方案,但它为我节省了一些时间。

<script type="text/javascript">
    $(document).ready ( function(){
        var delay = 1000;
        <?php
        $a=0;
        foreach($files as $file) { ?>
            delay=delay+3000;
            setTimeout(function (){ window.open("<?php echo $file; ?>"); }, delay);
        <?php } ?>
    });
</script>