Problem bei Anzeige von hochgeladenen Bildern mit private download und file_create_url (nur Platzhalter-Anzeige)
am 25.11.2008 - 01:03 Uhr in
Hi,
ich habe Probleme bei der Anzeige von Bildern, die von Benutzern hochgeladen wurden. Anstelle der Bilder werden nur Platzhalter angezeigt. Ich verlinke auf die Bilder mittels file_create_url().
Background: Ich habe einige Drupal Module geschrieben, die Anwendern erlauben Dateien hochzuladen, u.a. Bilder. Da diese Dateien nur fuer angemeldete Benutzer zugaenglich sein sollen, steht die download method auf 'private' und das Verzeichnis ist ausserhalb der ueber das Web zugaenglichen Ordner.
Der Ordner hat die Rechte 777.
Fuer den Upload der Dateien verwende ich file_save_upload(), kein existierendes Drupal Modul.
Ich kann die Dateien problemlos uber file_create_path() erreichen. Das verwende ich z.B. um die Groesse der dargestellten Bilder zu manipulieren und die Platzhalter haben die korrekt berechnete Bildgroesse.
Ich benutze file_create_url() um auf die Bilder zu verweisen. Die erstellten URLs scheinen korrekt zu sein, da sie auf den 'dummy' Folder verweisen - wie bei private method ueblich, z.B. in der Form: http://www.mysite.com/mytest/system/files/images/events/example.jpg. (wobei 'mytest' der Name meiner Drupal-Installation ist)
Allerdings werden nur die Platzhalter angezeigt, nicht die Bilder.
Weiss jemand Rat? Ich habe schon zig Foren etc durchsucht, aber kein entsprechendes Problem / Loesung gefunden.
Entwicklungsumgebung:
Drupal 5.12
PHP 5.2.5
Linux server bei hosting company mit Apache 1.3.37
Vielen Dank schon mal,
Natascha
- Anmelden oder Registrieren um Kommentare zu schreiben

Platzhalter von file_create_url()
am 25.11.2008 - 08:01 Uhr
Ich muss mal ganz dumm fragen: Der Platzhalter von file_create_url() verweist auf den richtigen Pfad?
Mit Platzhalter meinst Du die URL auf das Bild?
Wenn ja, dann fehlt Dir einfach ein
<?php<img src='".file_create_url()."' />
?>
drumherum?
---
~ http://drupalcamp.de/
img tag ist da
am 25.11.2008 - 09:17 Uhr
Mit Platzhalter meine ich den Kasten mit dem roten 'x' in der Ecke (hat das eigentlich einen Namen?).
Das Bild ist als img tag eingebunden in der Form:
<img src='http://www.mysite.com/mytest/system/files/images/events/example.jpg' >Dabei wird der Pfad von file_create_url erstellt. 'system/files' verweist auf das Drupal file upload directory.
Ich habe mich and die "file download Bibel" '10 things to know about file download in Drupal' von Caroline Hill gehalten. Laut dem Dokument erstellt file_create_url() diesen Link, der an sich so nicht existiert (sog. 'smoke screen'). Daher kann er von einem Browser nicht aufgerufen werden, AUSSER der Aufruf erfolgt durch Drupal und authentifizierte User (da download method auf 'private' steht).
Allerdings sehe ich ausser dem Platzhalter leider nix, seufz.
Wir kommen der Sache
am 25.11.2008 - 09:31 Uhr
Wir kommen der Sache näher.
Kannst Du denn die Grafik "http://www.mysite.com/mytest/system/files/images/events/example.jpg" im Browser direkt aufrufen?
Das geht schon. Du musst halt nur die richtigen Rechte haben. Bei den Rechten vermute ich jetzt auch Dein eigentliches Problem.
Sorry, this page doesn't exist anymore...
am 25.11.2008 - 09:49 Uhr
Nope, wenn ich den Link direkt im Browser eingebe, bekomme ich die Drupal-Anzeige "Sorry, this page doesn't exist anymore."
Die Ordner-Rechte stehen auf 777. Gibt es noch andere Rechte, die ich einstellen muesste?
(Vielen Dank uebrigens, dass Du Dir die Zeit nimmst!)
Nee, pass auf :) Die
am 25.11.2008 - 10:45 Uhr
Nee, pass auf :)
Die "Ordner-Rechte stehen auf 777" ist relativ gleich, da es eh durch ein Modul (system) geschleust wird. Dein Webserver brauch da halt nur Zugriff drauf.
Mal ein Beispiel:
Die http://www.drupal-initiative.de/system/files/shraum2.jpg darfst Du nicht sehen, da der Node dahinter für Dich auch nicht sichtbar ist.
Das http://www.drupal-initiative.de/system/files/DrupalCamp-CGN-200x60.gif allerdings schon, da dies zum http://www.drupal-initiative.de/node/82 gehört.
In Wirklichkeit liegen die Dateien sowieso nicht unter ".../system/files/..." sondern in Deinem echten Files-Verzeichnis. Bei Dir wahrscheinlich unter "files/images/events/".
Du müsstest als erstes mal überprüfen, ob die Grafik da wirklich existiert. Also im Pfad ohne das ".../system/..." dazwischen. "system" ist nur da Modul, welches sich um die Rechte kümmert.
Mit Rechten meinte ich "admin/user/permissions". Das "view uploaded files" musst Du schon dürfen ;)
Oh man. Umständlich erklärt :)
~ http://drupalcamp.de/
ja, ja, schon klar... :-)
am 25.11.2008 - 11:18 Uhr
ja, ja, schon klar (und gar nicht umstaendlich erklaert)... :-)
Da ich den Download auf 'private' gestellt habe, liegen meine Files nicht auf einem Web-zugaenglichen Verzeichnis, stattdessen auf dem Apache-Server in einem Verzeichnis parallel zum www-Verzeichnis. Meine Einstellung in Drupal fuer das Verzeichnis lautet entsprechend: "../../mytestfiles".
Sehen kann ich die Dateien und mit file_create_path() (das ../../mytestfiles verwendet) kann ich auch problemlos darauf zugreifen, denn die Platzhalter haben ja unterschiedliche Groessen (die ich anhand der Info geliefert mit Zugriff ueber file_create_path() errechne).
'view uploaded files' duerfen bei mir alle ausser 'anonymous users'.
Hmmm.... gruebel....
Tja, Grübel. Jetzt haben
am 25.11.2008 - 11:32 Uhr
Tja, Grübel. Jetzt haben wir zumindest eine Menge an Möglichkeiten ausgeschlossen.
Noch eine Frage: Du hast nicht zufällig Leerzeichen oder Umlaute mit drin? Das geht nämlich schief.
Nur alphanumerisch und Underscores
am 25.11.2008 - 12:32 Uhr
Nope, keine Sonderzeichen oder Umlaute, nur alphanumerisch und Underscores.
Vielen Dank auf jeden Fall fuer's Brainstorming.
*sigh*
Mal Step by Step
am 25.11.2008 - 14:29 Uhr
Um mich da ranzutasten, wo das denn passiert:
Standard-Installation:
- Seh zu, dass die Files in /sites/mysite/files liegen (oder so. Auf jeden Fall irgendwo im Web-Zugriff)
- Schalte Private-Download auf OFF
- Schau was passiert (Files sollten da sein)
Dann schaltest Du
- Private auf ON
- Nachschauen
- und schiebst Deine Files dahin wo sie hinsollen
- Nachschauen
Dazwischen immer schön schauen und drauf achten, dass der Browsercache auch leer ist.
Puh - geschafft !
am 25.11.2008 - 23:42 Uhr
Ok, ich hab's gefunden - eine schwere Geburt:
Das eigentliche Problem: Da ich auf keine existierende Funktion eines Drupal upload modules zugreife, sondern file_save_upload() benutze, weiss die Drupal Datenbank nichts ueber meine Uploads - und zeigt die Bilder auch nicht an (Stichwort: broken image icon).
Loesung: Ein File kann nicht runtergeladen werden - oder in meinem Fall als Bild angezeigt werden - wenn Drupal nichts von der Datei weiss. Daher muss ich einen hook file_download in meinem custom module erstellen, der den Header der Datei zurueckliefert, so dass Drupal Kenntnis davon hat. Der eingefuegte Quellcode lautet:
function mymodule_file_download($file) {if (!user_access('view uploaded files')) { return; }
$filepath = file_create_path($file);
$imageInfo = image_get_info($filepath);
$name = mime_header_encode(basename($file));
$size = $imageInfo['file_size'];
$type = mime_header_encode($imageInfo['mime_type']);
return array('Content-Type: '.$type.'; name='.$name.'Content-Length: '.$size);
}
Ta-ta - die Bilder werden angezeigt.
Ich bin auf die Loesung gestossen, nachdem ich mir die Dokumentation in File downloads in Drupal nochmals und nochmals durchgelesen habe, und es bei Kapitel 3 endlich *klick* gemacht hat. Das Dokument kann man uebrigens nach genehmigter Registrierung hier runterladen: http://11heavens.com/files-in-Drupal. Sehr empfehlenswert!
Sorry, narres, dass ich Dir die Muehe gemacht habe, aber super vielen Dank dafuer !!
Ja, ja, dies macht Sinn
am 26.11.2008 - 08:43 Uhr
Ja, ja, dies macht Sinn :)
Ist aber ja ein netter Thread geworden: Wie mach ich es in mehr Steps als nötig.
Dafür aber recht vollständig.
Nix zu danken. Drupal heißt auch eben auch zusammenhalten (Community plumbing).