我想根据用户等级将文件提供给某人,因此我需要将文件隐藏在隐藏的目录中。
我正在使用Plesk,结构如下:
api (reachable from https://api.pexlab.net)
cloud (reachable from https://cloud.pexlab.net)
default (reachable from https://pexlab.net)
error_docs
hidden (not reachable)
我的PHP脚本位于:
api/hub/Test.php (reachable from https://api.pexlab.net/hub/Test.php)
我已经尝试过了:
# In Test.php
downloadFile("../../hidden/hub/download/assets/user/main.fxml");
# Function:
function downloadFile($file) {
if(file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
}
此方法有效,但我想重定向到该文件(显示它)而不下载它。所以我试着用这个:
header("Location: ../../hidden/hub/download/assets/user/main.fxml");
但这试图重定向到无效的https://api.pexlab.net/hidden/hub/download/assets/user/main.fxml。
答案 0 :(得分:1)
“查看”和“下载”文件之间的唯一区别是浏览器对数据的处理方式。最终,这一切都在用户手中,但是服务器可以指示它想要发生什么。
我怀疑您是在没有真正理解它们的情况下复制了这些行:
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
这些都是对浏览器的说明,告诉浏览器如何处理您发送的数据。
Content-Disposition
标头用于告诉浏览器“而不是试图立即显示此内容,建议用户使用此名称将其保存在文件中”。要使用浏览器的默认行为,您只需忽略此标头,或将其赋予值inline
。Content-Type
标头告诉浏览器这是什么类型的文件。值application/octet-stream
的意思是“只是一堆字节,请勿尝试以任何方式解释它们”。显然,这对于在浏览器中查看文件并没有好处,因此您应该发送适当的“ MIME类型”,例如text/html
或image/jpeg
,以适合要提供的文件。我猜“ FXML”是基于XML的格式,因此text/xml
可能是合适的;或者如果它是人类可读的,并且您只想显示它而没有任何格式,请使用text/plain
。答案 1 :(得分:-1)
好的,我现在自己做。这非常简单,几乎没有代码:
$line = file('../../hidden/hub/download/assets/user/main.fxml');
foreach ($line as $num => $output) {
echo $output;
}