【问题标题】:Get content (images) from above webscope从上面的 webscope 获取内容(图像)
【发布时间】:2011-03-28 11:03:34
【问题描述】:

我正在创建一个在线服务,“特殊用户”可以在其中上传他们的图片。图像不会暴露给上传它们的用户以外的任何人,这一点非常重要。我听说保护图像的最佳方法是将它们放在 webscope 上。

到目前为止一切顺利。

我的问题是我无法显示图像,这是怎么做的?该应用程序是用PHP编写的,目录结构如下:

/ # 这是我放置图片的地方 /万维网 /www/domain.com/ # 这是网站的根目录

我已经建立了一个测试脚本来使用此代码检索图像

header('内容类型:图片/jpeg'); $image = imagecreatefromjpeg(realpath('../../image.jpg')); 图像JPEG($图像); 图像销毁($图像);

将图像传递给显示它的文件

谁能告诉我我做错了什么?会不会是 php.ini 设置不正确?有没有更简单的方法来保护图像?

提前致谢!!

// 马蒂亚斯·贝克

附:我如何在我的帖子中以正确的方式编写代码??

【问题讨论】:

    标签: php image


    【解决方案1】:

    您将错误地检索图像。没有理由将 JPEG 解码为内存中的原始位图(imagecreatefromjpeg(),如果原始图像很大,它会占用大量内存),重新压缩它(imagejpeg() 有所有的损耗和 CPU 开销随之而来),当您需要做的就是复制字节时。

    假设您希望能够为多个不同的用户上传多张图片,您需要某种方法来识别用户想要的图片,这可以通过将上传记录在数据库中并分配唯一 ID 来最简单地完成每个。关于如何做到这一点,这里还有很多其他答案,所以我不会再讨论它了。

    您的查看脚本会是这样的:

    <img src="retrieve-image.php?imageID=123" />
    

    retrieve-image.php 看起来像:

    <?php
    
    function is_user_allowed_to_see($imageID) {
       // figure out if user is allowed to see the specified image
    }
    
    if (is_user_allowed_to_see_this($_GET['imageID'])) {
        readfile("/www/uploads/domain.com/" . $_GET['imageID']);
    } else {
        readfile("/www/domain.com/sorry-not-allowed.jpg");
    }
    

    readfile() 是通过 PHP 将文件流式传输给用户的首选方式。它会负责读取文件的内容并将其分块发送到浏览器,不会超过脚本的内存限制。

    由于您将图像数据直接加载到 &lt;img&gt; 标记中,因此您无法输出纯文本“对不起,不允许看到此”文本,因为它是无效图像,您将只是获取损坏的图片图标。因此,如果用户不允许,请发送包含文本/图像(例如红色斜线圆圈)的图像而不是实际图像。

    【讨论】:

    • 感谢您的回答和 readfile() 代码。但它仍然不起作用:(当我输出 $_SERVER['DOCUMENT_ROOT']; 它打印 /home/www/domain.com/。我已将图像放在“home”文件夹中这是在 webscope 上。我写了 readfile(realpath("../../image.jpg")); 但这没有显示任何图像。还有其他建议吗?PS 如果可以的话,我会给你排名,但我没有'积分不够
    【解决方案2】:

    为什么不使用登录机制来验证是否允许某人访问图像? 这很容易做到,而且安全性很高。

    【讨论】:

    • 我有登录机制,但是如果有人只是输入“domain.com/path/to/image/image.jpg”,无论他是否登录都会显示。那是我的担心......
    • 在这种情况下,您需要将图像存储在数据库中,而不仅仅是将图像放在您的网络空间中。只有在允许的情况下,才让 php 脚本访问数据库中的图像。
    • 感谢您的快速回复!我可以这样做,但是 db-traffic 对于我要使用的卷来说太贵了,所以很遗憾这不是一个选择。
    • 你的图片会有多大?
    • 每个大约 3 - 4 mb。 (完整)映像的大小估计每年分配 50 Gb 磁盘空间。而且流量每年也会按比例增加。
    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2016-06-03
    • 2011-05-12
    • 2021-10-31
    • 1970-01-01
    相关资源
    最近更新 更多