Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php下载zip文件夹作为附件,未找到该文件夹_Php - Fatal编程技术网

php下载zip文件夹作为附件,未找到该文件夹

php下载zip文件夹作为附件,未找到该文件夹,php,Php,我有点不明白为什么找不到这个文件夹。我有一个脚本,在搜索数据库以根据存储的随机代码查找某人购买的$filename后,应该只返回他们的文件。我的代码如下所示(包括db查询的尾端): 当我运行此代码时,我收到“未找到文件”。因此!is_file($filepath)是它出错的地方——但是,路径是正确的,zip肯定在那里,所以我不确定这里出了什么问题 在调试方面,我尝试删除检查,直接转到headers和readfile,它返回一个空的zip文件夹。如果我通过URL直接导航到该文件,则会起作用 更新

我有点不明白为什么找不到这个文件夹。我有一个脚本,在搜索数据库以根据存储的随机代码查找某人购买的
$filename
后,应该只返回他们的文件。我的代码如下所示(包括db查询的尾端):

当我运行此代码时,我收到“未找到文件”。因此
!is_file($filepath)
是它出错的地方——但是,路径是正确的,zip肯定在那里,所以我不确定这里出了什么问题

在调试方面,我尝试删除检查,直接转到headers和readfile,它返回一个空的zip文件夹。如果我通过URL直接导航到该文件,则会起作用

更新 文件路径问题已经修复,但我仍然无法下载该文件。在所有尝试中,我都会得到
ERR\u INVALID\u响应
,或者如果我尝试强行下载文件,它会返回一个空文件。我尝试使用这些标题,但没有成功:

header_remove(); 
ob_end_clean();
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filepath));
readfile($filepath);
ob_end_flush();
exit;

它们是大型音频文件,似乎是导致问题的原因…

您有两种路径:

(a)URL的路径。您有一个定义网页根目录的web地址。 e、 是站点的开始。如果你在这个网站上回答问题,你总是有路径的

(b)网页所在驱动器的路径。它是文件系统根

e、 g./home/httpd/html/MyWebPage/questions

如果你尝试使用(b)中的/问题,它将失败,因为你需要完整的路径

因此,这意味着您需要知道“/media files/Label/”.$filename的位置。在我看来,/media文件不在文件系统(b)的根级别。 也许它位于web根目录下,但这还不足以让您的系统找到该文件。因此,你需要这样的东西:


“/root/httpd/MyWebPage/media files/Label/”。$filename

您有两种类型的路径:

(a)URL的路径。您有一个定义网页根目录的web地址。 e、 是站点的开始。如果你在这个网站上回答问题,你总是有路径的

(b)网页所在驱动器的路径。它是文件系统根

e、 g./home/httpd/html/MyWebPage/questions

如果你尝试使用(b)中的/问题,它将失败,因为你需要完整的路径

因此,这意味着您需要知道“/media files/Label/”.$filename的位置。在我看来,/media文件不在文件系统(b)的根级别。 也许它位于web根目录下,但这还不足以让您的系统找到该文件。因此,你需要这样的东西:

“/root/httpd/MyWebPage/media files/Label/”。$filename

是绝对正确的,这是一个路径错误的问题。以下是一篇文章的链接,该文章应该可以澄清问题:

当前,您的脚本正在以下位置尝试查找文件:

/媒体文件/Label/file.zip

不是:

/var/www/myproject/media files/Label/file.zip

链接文章应为您提供所有必要的信息

TLDR

使用:

更新

对于文件大小问题,可能是PHP在尝试加载整个文件时耗尽了允许的内存。我们可以尝试以下方法:

flush();
$file = fopen($filepath, "r");
while(!feof($file)) {
    // send the current file part to the browser
    print fread($file, round(10 * 1024));
    // flush the content to the browser
    flush();
}
fclose($file);
flush()有一些问题,但我认为这是一个很好的选择。您可以阅读以下内容:

除此之外,总是有可能将文件分割成更小的块。

是绝对正确的,这是一个路径误解的问题。以下是一篇文章的链接,该文章应该可以澄清问题:

当前,您的脚本正在以下位置尝试查找文件:

/媒体文件/Label/file.zip

不是:

/var/www/myproject/media files/Label/file.zip

链接文章应为您提供所有必要的信息

TLDR

使用:

更新

对于文件大小问题,可能是PHP在尝试加载整个文件时耗尽了允许的内存。我们可以尝试以下方法:

flush();
$file = fopen($filepath, "r");
while(!feof($file)) {
    // send the current file part to the browser
    print fread($file, round(10 * 1024));
    // flush the content to the browser
    flush();
}
fclose($file);
flush()有一些问题,但我认为这是一个很好的选择。您可以阅读以下内容:


除此之外,总是有可能将文件分割成更小的块。

您是否尝试过调试代码?例如,filepath变量的var转储?您试图解决什么问题?
/media files
是指一个绝对路径,指向应用程序之外的文件夹吗?假设该文件是
file.zip
,则
var\u dump
返回我所期望的:
string(27)“/media files/Label/file.zip”
。所以在我看来是对的@Nico Haase,我打算从根文件夹指向路径。但代码也在根级别。“我打算从根文件夹指向路径。”-你是说web根目录还是文件系统根目录?您是否意识到了差异?是否尝试过调试代码?例如,filepath变量的var转储?您试图解决什么问题?
/media files
是指一个绝对路径,指向应用程序之外的文件夹吗?假设该文件是
file.zip
,则
var\u dump
返回我所期望的:
string(27)“/media files/Label/file.zip”
。所以在我看来是对的@Nico Haase,我打算从根文件夹指向路径。但代码也在根级别。“我打算从根文件夹指向路径。”-你是说web根目录还是文件系统根目录?你知道其中的区别吗?你说的“你需要整条路”是什么意思
/media files/Label
是一个完全有效的文件夹名称这也是@CBroe提到的区别。有一个web根目录(a)和一个文件系统根目录
flush();
$file = fopen($filepath, "r");
while(!feof($file)) {
    // send the current file part to the browser
    print fread($file, round(10 * 1024));
    // flush the content to the browser
    flush();
}
fclose($file);