【问题标题】:Access and Display Images/ Prompt File Downloads that are located outside the application folder访问和显示位于应用程序文件夹之外的图像/提示文件下载
【发布时间】:2010-11-04 19:54:46
【问题描述】:

如何访问和显示位于应用程序文件夹之外的图像?假设我有一个存储所有图像和其他文件类型的文件目录,并且该文件目录与我的应用程序文件夹位于不同的驱动器上。对于某些文件类型(如 .pdf、.doc,我想提示用户下载这些文件)。

据我所知,不可能将绝对路径放在<img src 属性中,即img src="D:\\file directory"> 不起作用。还有我只想限制登录用户的访问权限

我使用 PHP 作为我的服务器端语言。

注意: <img src="file:/// .../> won't work in Firefox。在这里查看comments

编辑:由于只有经过身份验证的用户才能访问这些图像,并且由于我有一个 index.php 来检查所有传入请求,过滤掉未经身份验证的用户,所以我认为创建 Apache Alias 不会工作。

这是我的 conf 文件的示例:

  NameVirtualHost *:80
  <VirtualHost *:80 >
    ServerName pmmenu.businessjob.net
    DocumentRoot "D:\web"
    DirectoryIndex index.html index.php
    <Directory  "D:\web">
       AddDefaultCharset UTF-8
       Order Deny,Allow
       Allow from all
       RewriteEngine on
       RewriteBase /
       RewriteRule ^$ index.html [QSA]
       RewriteRule ^([^.]+)$ $1.html [QSA]
       RewriteCond %{REQUEST_FILENAME} !-f

       # no, so we redirect to our front web controller
       RewriteRule ^(.*)$ index.php [QSA,L]
    </Directory>
  </VirtualHost>

【问题讨论】:

  • 您能否澄清一下 - 图像是否存储在浏览器可访问的文件系统上? (即本地驱动器、Windows 文件和打印共享共享等)
  • 应用程序位于C:,而图像位于D。因此浏览器应该可以访问图像。

标签: php html apache


【解决方案1】:

我认为您在这里缺少一个基本概念。所有 HTML 都在客户端进行解释。每个图像由访问者的浏览器单独下载。由于您的访问者只能访问那些公开的文件,因此“file:///something”对他们不起作用,因为这会要求他们的浏览器访问本地(他们的)文件系统,该文件系统将被阻止或找不到所请求的图像,因为它没有存储在他们的磁盘上。

因此,您必须发布这些图片并通过 http 访问它们,以便您的访问者可以看到它们。您可以通过创建子域或虚拟目录来做到这一点。

由于您只希望经过身份验证的用户能够看到他们,您还可以创建一个 php 文件来检查用户是否经过身份验证,例如像这样:

if(user_is_authenticated()){
    $pathToFile = "d:\images\myimage.jpg";
    $handle = @fopen($pathToFile, "rb");
    $contents = @fread($handle, filesize($pathToFile));
    @fclose($handle);
    //sent appropriate header
    header('Content-type: image/jpeg');
    echo $contents;
}

但您必须注意,此脚本将始终读取整个图像并随后打印,这是一个巨大的开销。

【讨论】:

【解决方案2】:

尝试为包含图像的文件夹创建一个虚拟目录,并将其用作链接到该文件夹​​的链接。如果使用 IIS(虚拟目录)如果 apache(虚拟主机)。 google上有很多教程

【讨论】:

    【解决方案3】:

    从 php.ini 提供文件总是一个坏主意。如果你可以在 apache 之前安装 nginx 使用http://kovyrin.net/2006/11/01/nginx-x-accel-redirect-php-rails/lang/en/

    否则使用apache模块:http://john.guen.in/past/2007/4/17/send_files_faster_with_xsendfile/

    另一种解决方案 - 创建单独的符号链接(作为奖励,您将能够提供日期有限的链接,清除 cron 中的符号链接)。

    【讨论】:

    • 访问仍然是经过身份验证的,但是有一个新的头文件可以被 php 用来将文件“移交”到网络服务器。
    【解决方案4】:

    目前我无法测试这些理论中的任何一个,但我很确定您可以将 img src 链接到一个 php 脚本:

    • 使用 GD 制作图像的动态版本,或
    • 以与强制下载文件相同的方式将其下载到浏览器。

    【讨论】:

    • 使用 gd 并下载到浏览器...任何 url 或代码?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2011-02-07
    • 2012-03-28
    • 1970-01-01
    • 2023-04-03
    • 2017-07-09
    相关资源
    最近更新 更多