PHP 文件名和扩展名恢复
PHP file name and extension restoration
我在一个目录中有一堆文件,这些文件具有随机的 16 位文件名并且没有文件扩展名,例如'RTSWZci59BqXDqaV'
我有一个数据库,通过各种调用和关系我可以找到文件的原始名称、扩展名和内容类型。 'Original',因为这些都是曾经通过网站(我没有建立)上传到服务器的文件。
我写了一小段代码来遍历文件并将它们全部重写为原始文件名和扩展名。这在一定程度上有效,因为 .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(),设置headers连一个文件都下载不了
有什么明显的地方我应该在这里做不同的事情吗? 一定是图片在上传时发生了其他编码问题吗?从服务器上获取这些文件后,我可以对它们执行任何操作吗?
文件名不能使其损坏,除非尝试使用错误的程序/导入过滤器打开它(例如,尝试将 JPEG 作为 Word 文档打开,反之亦然)。
如果图像看起来几乎正确,那么听起来好像发生了一些数据损坏,并且您的文件名正确但内容不正确。
我假设您是从以前的某个位置导出它们的,这就是它们具有虚拟名称的原因?也许在该过程中,文件已被截断为特定大小,或者遇到了 NULL 字节。或者某些字节可能被解释为某些特定文本编码中的字符,而不是按原样复制。
如果它们在数据库中,则您可能使用并非为处理二进制数据而设计的驱动程序或查询类型来选择它们。
我最终只是复制了我在示例中描述的单个 header 下载方法,其中一些 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>
我在一个目录中有一堆文件,这些文件具有随机的 16 位文件名并且没有文件扩展名,例如'RTSWZci59BqXDqaV'
我有一个数据库,通过各种调用和关系我可以找到文件的原始名称、扩展名和内容类型。 'Original',因为这些都是曾经通过网站(我没有建立)上传到服务器的文件。
我写了一小段代码来遍历文件并将它们全部重写为原始文件名和扩展名。这在一定程度上有效,因为 .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(),设置headers连一个文件都下载不了
有什么明显的地方我应该在这里做不同的事情吗? 一定是图片在上传时发生了其他编码问题吗?从服务器上获取这些文件后,我可以对它们执行任何操作吗?
文件名不能使其损坏,除非尝试使用错误的程序/导入过滤器打开它(例如,尝试将 JPEG 作为 Word 文档打开,反之亦然)。
如果图像看起来几乎正确,那么听起来好像发生了一些数据损坏,并且您的文件名正确但内容不正确。
我假设您是从以前的某个位置导出它们的,这就是它们具有虚拟名称的原因?也许在该过程中,文件已被截断为特定大小,或者遇到了 NULL 字节。或者某些字节可能被解释为某些特定文本编码中的字符,而不是按原样复制。
如果它们在数据库中,则您可能使用并非为处理二进制数据而设计的驱动程序或查询类型来选择它们。
我最终只是复制了我在示例中描述的单个 header 下载方法,其中一些 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>