我正在从服务器收集一些文件,并用PHP生成一个压缩包。一切都进行得非常顺利,直到我下载了压缩文件并试图打开该文件。阅读器抛出一个异常"不支持文件类型纯文本文档(text/plain) "。文件命名正确(c102.pdf)。我推测文件的mime类型是如何弄乱的,但我不太确定。
php version 5.4.37
我应该注意的是,我在本地使用的是ubuntu 14.04,我的阅读器是默认的文档查看器,然而,它在上传文件之前正确地读取文件。
跟进-这可能是权限问题吗?"downloads"目录设置为777,而在其中创建的新zip文件为644。这就好像"空白"文件被放置在zip存档中(zip的总大小为1.6k,应该至少有几百个)。
另一个后续-下面的帖子讨论了chmod问题PHP:生成的zip文件有chmod 644,如何设置权限777到zip文件?. 然而,chmod()方法对我不起作用- chmod()无法在服务器上执行(我已经修改了下面的代码)。我们来看看技术支持怎么说。
本题答案.....
在与客户支持人员交谈后-这些都不起作用的原因是因为我在共享主机帐户上。chmod()函数是受限制的,否则应该可以工作。
我的传奇还在继续…我现在在EC2实例上有一个LAMP堆栈,就在我认为我是老板的时候-我仍然处于相同的绑定中。我的程序在正确的目录中生成了一个zip文件—具有所有适当的文件名—但是这些文件是空的。我仍然认为这是一个所有权/许可问题。所以,一些后续问题…
web服务器上的文件夹归"Ubuntu"所有,而新创建的文件归"www-data"所有。那么,谁是"www-data"?是Apache还是PHP?PHP也是Apache吗?为什么我不能chmod()文件创建后,使他们不是644?zip的文件状态是644是我无法写入的原因吗?我可以强制目录中新创建的文件具有不同的所有权或特定的一组权限吗?
if (isset($_GET['getzip'])) {
$issuedsetid = $_GET['getzip'];
$time = mktime();
$sql = "SELECT * FROM issuedsets WHERE id=$issuedsetid";
if ($result = $mysqli->query($sql)) {
while($row = $result->fetch_assoc()) {
$packid = $row['packid'];
$sheets = $row['sheets'];
$sheets = explode(",",$sheets);
}
}
$sql = "SELECT * FROM pname WHERE id=$packid";
if ($result = $mysqli->query($sql)) {
while($row = $result->fetch_assoc()) {
$packname = $row['name'];
}
}
// create the zip file
$path = "/home/marekfalkowski/public_html/index/downloads/".$packname."_" . $time . ".zip";
$zip = new ZipArchive();
// Open a new zip file
$zip->open($path, ZipArchive::CREATE);
if (chmod($path,0777)){
echo "chmod succesful";
} else {
echo "not succesful";
}
foreach($sheets as $sheet){
// the saved file name as it exists on the server...
$file = $sheet.".pdf";
// the new name of the file...
$sql = "SELECT * FROM files WHERE id=$sheet";
if ($result = $mysqli->query($sql)) {
while($row = $result->fetch_assoc()) {
$filename = $row['number']."-".$row['name'].".pdf";
}
}
// add the files
if (file_exists("/home/marekfalkowski/public_html/index/uploads/".$file)) {
$zip->addFile("/home/marekfalkowski/public_html/index/uploads/".$files, $filename);
} else {
echo "not there";
}
}
$zip->close();
}
这是个愚蠢的错误。这条线:
$zip->addFile("/home/marekfalkowski/public_html/index/uploads/".$files, $filename);
需要修改为:
$zip->addFile("/home/marekfalkowski/public_html/index/uploads/".$file, $filename);
这真是浪费时间。