2016-06-20 34 views
1

Einfache Frage, wurde wahrscheinlich eine Million Mal gefragt, aber ich habe gesucht und bin nicht näher daran, dies zur Arbeit zu bringen.Öffnen Sie eine Datei im Browser bedient von PHP

Ich habe einen PHP-Skript im UserFrosting Framework, das eine Datei an den Benutzer über den Browser bedient. Ich möchte, dass die Datei in ihrem Browser geöffnet wird, wenn sie "Öffnen" und Download auswählen.

Problem ist, sind die einzigen Dinge, die richtig sind Textdateien öffnen. Alles andere (PDFs und JPGs, die bisher getestet wurden) wird nur als eine Seite mit ASCII/unlesbarem Code geöffnet, anstatt als PDF oder Bild interpretiert zu werden.

Hier ist der Code, den ich mit:

header('Content-Type: '. $mime); 
header('Content-Length: ' . filesize($diskname)); 
header('Content-Disposition: inline; filename=' . $savename); 
return readfile($diskname); 

$mime ist der Mime-Typ der Datei über eine Funktion eingestellt, könnte so application/pdf oder image/jpeg für die Dateien, die ich bisher zu sehen bin versucht.

Hat jemand irgendwelche Ideen, warum die Dateien nicht richtig öffnen?

UPDATE Nachdem die Antwort-Header überprüft, ich bin einen Inhaltstyp von text/html;charset=UTF-8 anstelle der application/jpeg oder application/pdf bekommen, dass es nach dem Code festgelegt haben soll ich benutze. Ich frage mich, ob dies ein UserFrost-Problem ist?

+1

"könnte application/pdf oder image/jpeg sein" - Haben Sie überprüft, dass das ist, was der Server tatsächlich sendet? – Quentin

+0

Nun $ mime wird definitiv auf application/pdf oder image/jpeg gesetzt, abhängig von der Datei. Mein Browser debug-fu ist allerdings nicht toll (mit Firefox), die Datei wird in einem neuen Tab geöffnet und es erscheint ein Fehler, der sagt: "Die Zeichenkodierung des HTML-Dokuments wurde nicht deklariert."Ich gehe davon aus, dass der Content-Type irgendwie verloren geht? – nockieboy

+0

Öffnen Sie die Entwickler-Tools. Schauen Sie auf der Registerkarte Netzwerk. Laden Sie die Seite. Es zeigt Ihnen alle Anfragen und Antworten und lassen Sie die Header und Rohdaten untersuchen. – Quentin

Antwort

1

Okay, Problem gelöst. Wie ich vermutete, ging es um das UserFrost-Framework oder genauer gesagt um Slim.

Statt den Headern von Einstellungen header('Content-Type: image/jpeg');, sollte ich Sie folgendermaßen vorgehen wurden:

$this->_app->response->headers->set('Content-Type', $mime); 

Problem gelöst. :)

0

Da ich nicht Ursache des Rufes kommentieren, ich werde antworten müssen, auch wenn ich nicht 100% sicher bin, dass dies Ihr Problem ist.

Die Sache ist, manchmal PHP-Dateien eine Menge Ärger verursachen können.

<--- this little empty line 
<? 
code goes here 
?> 
<--- or this one 

Die markierte leere Zeile können Sie Ihren Kopf zerstören. Haben Sie alle Ihre Dateien auf leere Zeilen überprüft, die anstelle von PHP-Code als Inhalt interpretiert werden?

Das Aktivieren von Warnungen kann auch in dieser Angelegenheit helfen. Wenn vor dem Setzen der Header Inhalte vorhanden sind, erhalten Sie normalerweise eine Warnung, in der genau dies angegeben wird.

Wir hatten dieses eine Mal in unserer Gesellschaft und es kostet 3 unserer Devs fast einen ganzen Tag, weil ... Gründe zu finden.

BEARBEITEN: Ihren Kommentar sehen "Die Zeichencodierung des HTML-Dokuments wurde nicht deklariert." unterstreicht meine Aussage. Jedenfalls nicht 100% sicher, tho.

+0

Ich habe Fehlermeldung auf 'E_ALL' in php.ini festgelegt, also nehme ich an, dass ich Warnungen sehen sollte, wenn sie generiert werden, aber ich bekomme nichts in das Fehlerprotokoll ..? – nockieboy

+0

Der Rest der Header ist jedoch intakt - es ist nur der Inhaltstyp, der geändert wird ..:/ – nockieboy

+0

Nun, sieh dir das an: [link] (http://Stackoverflow.com/a/2649879/6479510) .Es gibt einige tiefere Informationen in das gleiche Problem mit dem Inhaltstyp. Ich bin mir ziemlich sicher, dass irgendwo in einer Ihrer Dateien etwas ausgegeben werden muss. –