我在目录中有一堆文件,其中包含随机的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(),甚至无法通过设置标题来下载单个文件。
有什么明显的东西我应该在这里采取不同的做法吗? 必须是否会在上传图片时发生其他编码?一旦我将这些文件从服务器上取下,我可以对这些文件做任何事吗?
答案 0 :(得分:0)
除了尝试使用错误的程序/导入过滤器打开文件名(例如,尝试将JPEG作为Word文档打开,反之亦然)之外,文件名不能使其损坏。
如果图像看起来接近,那么听起来好像发生了一些数据损坏,并且你有正确的文件名,但没有正确的内容。
我假设你从之前的某个位置导出它们,这就是为什么他们有虚拟名称?也许在该过程中,文件已被截断为特定大小,或遇到NULL字节。或者某些字节在某些特定的文本编码中被解释为字符,而不是按原样复制。
如果他们在数据库中,您可能使用非设计用于处理二进制数据的驱动程序或查询类型来选择它们。
答案 1 :(得分:0)
我最后只是复制了我在我的示例中描述的单一标题下载方法,其中一些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>