我们正在制作在线相册。人们需要登录才能看到图片。我们也试图保护图片文件,但我们遇到了问题
通过会话变量,我们检查用户是否已登录。
$_SESSION['is_ingelogd']
我们构建一个安全页面(检查用户是否已登录)。我们将此页面包含在每个必须保护的页面中。但现在我们也希望保护图像。
因此,我们构建了一个.htaccess文件,该文件将我们照片文件夹中文件的所有请求引用到php页面。 php页面必须检查用户是否已进入。 如果用户没有进入,它将回显带有登录请求的文本。 如果用户已登录,则php文件必须发送所请求的文件(图像)。
我们使用以下代码执行此操作:
.htaccess文件(在文件夹/ fotoalbum / uploads /中):
RewriteEngine On
RewriteBase /fotoalbum/
RewriteCond %{SCRIPT_FILENAME} !image\.php
RewriteCond %{REQUEST_URI} !image\.php
RewriteRule ^(.*)$ image.php [QSA,L]
.php文件(在文件夹/ fotoalbum /中):
<?php
session_start();
if ($_SESSION['is_ingelogd'] == "1") {
$type = mime_content_type((string)$_SESSION['REQUEST_URI']);
header("Content-type: ".$type);
echo file_get_contents($_SESSION['REQUEST_URI']);
exit;
} else{
echo 'Please <a href="../login.php">login</a> to see this
file.';
}
?>
此代码可以正常工作; 如果用户没有进入并尝试打开文件夹/ fotoalbum / uploads /的任何文件,则php会显示登录请求。
但是如果用户登录,我们看不到图片。 在IE9中,屏幕保持空白,在FireFox 3.6中,png返回图像不能为的消息 显示,因为它包含错误。 jpg返回它的url,txt文件返回
我们借助以下链接构建此脚本:
感谢您的帮助
我做了一些原型设计,mime_content_type((string)$_SESSION['REQUEST_URI']);
的返回似乎是空白/ null。
我将以下代码放在php文件中:
<?php
$serveruri = parse_url($_SERVER['REQUEST_URI']);
$fileuri = (string)('./uploads/'.basename($serveruri['path']).PHP_EOL);
$file = strval($fileuri);
echo 'URL Is: '.$file;
echo '<br />type Is: '.mime_content_type((string)$file);
exit;
?>
浏览器显示:
URL Is: ./uploads/test.jpg
Type Is:
您可以看到它不会回显内容类型。 但是当我设置
$file = './uploads/test.jpg';
它完美地回归:
URL Is: ./uploads/test.jpg
Type Is: image/jpeg
有什么建议吗?
答案 0 :(得分:1)
通过这个主题的许多提示,我使它成功了。 但是它现在可以使用URL中的查询字符串。
文件夹fotoalbum / uploads /中的.htaccess文件:
Options -Indexes
<Files *>
deny from all
</Files>
文件夹/ fotoalbum /中的getfile.php文件:
<?php
//this file checks if user is logged in and dies the request if the user is not logged in
include_once('./config.php');
$file = "uploads/" . $_GET['f'];
$type = mime_content_type($file);
header("Content-type:" .$type);
echo file_get_contents($file);
?>
要获取图像(或任何类型的文件),网址为getfile.php?f=file.extension
(其中file.extension是文件夹fotoalbum / uploads /中的文件。
非常感谢大家的帮助!
答案 1 :(得分:0)
我猜PHP文件与BOM一起保存,保存时没有BOM。
为什么我猜这个:看起来像一个BOM
答案 2 :(得分:0)
您好 我在这里拍摄,但你检查过以确保mime_content_type为你的文件返回正确的mime类型?这似乎是声明
header("Content-type: ".$type);
输出不正确,则图像或文本文件也无法正确输出。 PHP.net表示不推荐使用mime_content_type函数,因此您可能想要试用finfo_file函数。
祝你好运!
答案 3 :(得分:0)
在将图像和其他二进制文件传输回客户端时,应使用readfile()而不是echo file_get_contents()。
<强>更新强>
您使用mime_content_type()时遇到的问题是PHP_EOL正在添加换行符。还有很多不必要的类型铸造。以下是适用于您的清理版本:
<?php
$serveruri = parse_url($_SERVER['REQUEST_URI']);
$file = basename($serveruri['path']);
echo 'URL Is: ' . $file;
echo '<br />type Is: ' . mime_content_type($file);
exit();
?>