访问和显示位于应用程序文件夹外部的图像/提示文件下载

时间:2009-06-22 11:34:46

标签: php html apache

如何访问和显示位于应用程序文件夹之外的图像?假设我有一个存储所有图像和其他文件类型的文件目录,并且此文件目录位于与我的应用程序文件夹不同的驱动器上。对于某些文件类型(例如.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>

4 个答案:

答案 0 :(得分:6)

我认为你在这里错过了一个基本概念。所有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;
}

但你必须要知道,这个脚本将始终读取整个图像并随后打印,这是一个巨大的开销。

答案 1 :(得分:1)

尝试创建保存图像的文件夹的虚拟目录,并将其用作链接到文件夹的链接。如果使用IIS(虚拟目录),如果是apache(虚拟主机)。 Google上有很多教程

答案 2 :(得分:1)

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

之前安装nginx

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

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

答案 3 :(得分:0)

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

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