2009-06-22 7 views
2

Wie kann auf Bilder zugegriffen werden, die sich außerhalb des Anwendungsordners befinden? Nehmen wir an, ich habe ein Dateiverzeichnis, in dem alle Bilder und andere Dateitypen gespeichert sind, und dieses Dateiverzeichnis befindet sich auf einem anderen Laufwerk als meinem Anwendungsordner. Bei bestimmten Dateitypen (wie .pdf, .doc, möchte ich den Benutzer auffordern, diese Dateien herunterzuladen).Zugriff und Anzeige von Bildern/Abfrage von Dateidownloads, die sich außerhalb des Anwendungsordners befinden

Soweit ich weiß, ist es nicht möglich, absoluten Pfad in die <img src Attribute, d. H. img src="D:\\file directory"> funktioniert nicht. Und auch Ich möchte den Zugriff auf Login-Benutzer nur beschränken.

Ich benutze PHP als meine serverseitige Sprache.

Hinweis:<img src="file:/// .../>won't work in Firefox. Siehe hier für comments.

Bearbeiten: Da nur authentifizierte Benutzer auf diese Bilder zugreifen können, und da ich eine index.php habe, die alle eingehenden Anfragen überprüft, filtert nicht authentifizierte Benutzer, ich glaube nicht, dass die Erstellung eines Apache Alias ​​funktioniert .

Hier ist ein Beispiel für meine conf-Datei:

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> 
+0

Können Sie klären - sind die Bilder in einem Dateisystem gespeichert, auf das der Browser zugreifen kann? (d. h. ein lokales Laufwerk, eine Windows-Freigabe für Datei- & Druckfreigabe usw.) – Quentin

+0

Die App befindet sich auf C:, während die Bilder auf D liegen. So sollten die Bilder für den Browser zugänglich sein. – Graviton

Antwort

6

Ich denke, dass Sie hier ein grundlegendes Konzept vermissen. Alles HTML wird clientseitig interpretiert. Jedes Bild wird separat vom Browser Ihres Besuchers heruntergeladen. Da Ihre Besucher nur auf die Dateien zugreifen können, die öffentlich sind, funktioniert "file: /// irgendwas" für sie nicht, da dies ihren Browser auffordert, auf das lokale (ihr) Dateisystem zuzugreifen, das entweder blockiert ist oder die angeforderte Datei nicht findet Bild, wie es nicht auf ihrer Festplatte gespeichert ist.

Also müssen Sie diese Bilder veröffentlichen und sie über http zugänglich machen, damit Ihre Besucher sie sehen können. Sie können dies tun, indem Sie eine Subdomain oder ein virtuelles Verzeichnis erstellen.

Da nur authentifizierte Benutzer diese sehen sollen, können Sie auch eine PHP-Datei erstellen, die überprüft, ob der Benutzer authentifiziert ist, z. wie folgt aus:

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; 
} 

Aber Sie sich bewusst sein, dass dieses Skript immer das ganze Bild gelesen wird und es anschließend drucken, was ein großer Aufwand ist.

+0

Siehe auch diese Frage: http://stackoverflow.com/questions/1385964/how-to-get-the-browser-to-cache-images-with-php – middus

1

versuchen, ein virtuelles Verzeichnis des Ordners erstellen, die Bilder enthält und verwenden, die als weg zu dem Ordner zu verknüpfen. Bei Verwendung von IIS (ein virtuelles Verzeichnis) wenn Apache (ein virtueller Host). Es gibt viele Tutorials auf Google

0

ich eine dieser Theorien ist im Moment nicht testen können, aber ich bin mir ziemlich sicher, dass Sie das img src zu einem PHP-Skript in Verbindung bringen könnte, dass entweder:

  • Uses GD, um eine dynamische Version des Bildes zu erstellen, oder
  • lädt es auf die gleiche Weise zum Browser herunter, wie Sie eine Datei erzwingen würden.
+0

entweder mit gd und Download in den Browser ... eine beliebige URL oder Code? Vielen Dank. – Graviton

+0

siehe meine aktualisierte Antwort – middus

1

Es ist immer eine schlechte Idee, Dateien von PHP zu liefern.Wenn Sie nginx vor Apache Verwendung http://kovyrin.net/2006/11/01/nginx-x-accel-redirect-php-rails/lang/en/

Ansonsten verwenden Apache-Modul installiert werden kann: http://john.guen.in/past/2007/4/17/send_files_faster_with_xsendfile/

Eine andere Lösung - schaffen individuelle Symlinks (als Bonus, den Sie werden in der Lage sein Datum begrenzt Links zu geben, Symlinks in cron Clearing).

+0

Der Zugriff ist immer noch authentifiziert, aber da ist ein neuer Header, mit dem php die Datei an den Webserver "übergeben" kann. – txyoji

Verwandte Themen