Tuesday, 4 July 2017

Php Mime Typ Binär Optionen


Ein MIME-Typ für. php-Dateien Beim Setzen von einigen Svn-Eigenschaften bei der Arbeit haben wir uns über den richtigen MIME-Typ für. php-Dateien gefragt. Schauen Sie sich in den verschiedenen magischen MIME-Typ-Erkennungslisten auf unseren Unix-Maschinen und der offiziellen IANA MIME-Typ-Liste an. Die Optionen, auf die wir eingegangen sind, waren: MIME-Typ rulesx200B Da es keinen offiziellen MIME-Typ gibt, der bei IANA registriert ist, kann nur ein Erweiterungstyp (x-prefixed) verwendet werden - was bedeutet, dass Textphp und Applicationphp nicht geeignet sind: Jeder nicht registrierte Dateityp sollte Mit einem vorangehenden x - aufgeführt werden. Wie in applicationx-foo (RFC2045 5.1) oder ein x. . Wie in applicationx. foo (RFC4288 4.3). Jeder nicht x-prefixed Typ sollte bei IANA registriert und an der oben genannten Adresse aufgeführt werden. Jedes andere Verhalten ist ein MIME-Standard-Verstoß Linux distributionsx200B Ubuntus Magic MIME-Datenbank - verwendet durch die Datei Befehl - spuckt Textx-PHP. Debian-Mime-Support-Paket, das auch von Ubuntu ausgeliefert wird, listet Applicationx-httpd-php für. php und applicationx-httpd-php-source für. phps-Dateien in etcmime. types auf. Diese beiden Typen sind - in meinen Augen - mehr für den internen Apachewebserver Gebrauch, da PHP nicht nur innerhalb eines http-Daemons verwendbar ist. IANA considerationsx200B Was übrig ist, sind textx-php und applicationx-php. Ich persönlich bevorzuge Text für Benutzer lesbare Klartext-Dateien, weshalb ich skeptisch über applicationx-php auf den ersten war. Dann habe ich gesehen, dass im Jahr 2006 IANA offiziell Applicationjavascript für JavaScript-Code-Dateien - und nicht Textjavascript. Die RFC-Zustände: Die Verwendung der Text-Top-Level-Typ für diese Art von Inhalt ist bekannt als problematisch. - aber nicht zu sagen, warum das so ist. Ich denke, das ist, weil Sicherheitsprobleme entstehen, da die Browser versuchen, jeden Text MIME-Typ als HTML anzuzeigen. Ein ähnliches Argument wurde bei der Bewerbung für den JSON MIME-Typ verwendet, der offiziell in RFC 4627 zugewiesen wurde. Auf die Frage, warum nicht textjson, scheint Crockford zu sagen, JSON ist nicht wirklich Javascript noch Text und auch IANA war eher zu verteilen Anwendung als Text. Andere Sprachenx200B Die Betrachtung der offiziell zugewiesenen Textarten macht deutlich, dass es im Club keine einzige Programmiersprache gibt. (HTML ist, wie der Name schon sagt, ein Markup und keine Programmiersprache - weshalb texthtml nicht zählt.) Die Liste der Applikationstypen enthält dagegen Typen wie Applicationecmascript und Applicationjavascript. Beide Programmiersprachen. Darüber hinaus stellt auch Debian mehrere Programmiersprachen in die Anwendungsgruppe ein: applicationx-ruby. Applicationx-sh und applicationx-tcl. Downsidesx200B Verwenden von applicationx-php als MIME-Typ für. php-Dateien ist nicht ohne Schmerzen. Ein Typ, der mit Text beginnt, zeigt an, dass der Inhalt der Datei menschlich lesbar ist. Ich kann es öffnen und einen Griff bekommen, was los ist, auch wenn ich nicht alles verstehe, wenn ich nicht die spezifische Sprache kenne, die die Datei hat. Ich kann Textdienstprogramme benutzen: Katze. Grep Sed Diff - du nennst es Es muss nicht einmal ich selbst sein, das die Werkzeuge benutzt, die es sein kann, eine Anwendung oder ein Shell-Skript, das ich geschrieben habe, dass ich mit einer Textdatei arbeitet und die entsprechenden Werkzeuge verwende. Dateien mit einem Typ, der mit der Anwendung auf der anderen Seite beginnt, kann nur darauf ausgelegt werden, nur maschinenlesbar zu sein. Die Verwendung von applicationjava-vm für. class-Dateien ist völlig gut, da nur ein Computer es lesen kann - sowie applicationzip und applicationvnd. oasis. opendocument. spreadsheet. Ein Tool, das mit applicationx-php schlecht ausfällt, ist das oben genannte svn. Es erkennt Textdateien, wie ich beschrieben habe, indem ich den MIME-Typ-Medienteil verwende. Das Festlegen des MIME-Typs einer. php-Datei auf applicationx-php führt zu dem Problem, dass es PHP-Dateien als Binär verarbeitet und damit nicht verteilt wird - Diffs in PHP-Projekten unbrauchbar machen. Wir mussten in unsere svn-Repositories zurück zu textx-php gehen. Das gleiche Problem entsteht bei der Verwendung des offiziellen Anwendungsjavascript-Typs. Der zugehörige Fehlerbericht schlägt vor, eine Reihe von Anwendungstypen auf das zu setzen, ist eine Textdateiliste. Und genau das ist das Problem: Wie soll ein Programmierer erkennen, ob eine Datei menschlich lesbar ist und angezeigt werden kann Mit IANA diktieren Realitäten, die auf Applikationstypen drängen, ist der MIME-Typ kein Indikator mehr. Conclusionx200B Das Einsetzen von Programmiersprachen in die Applikationsgruppe hat eine statistische Signifikanz und wird auch durch frühere IANA-Entscheidungen unterstützt. So scheint es seine unvermeidliche Anwendung Applicationx-PHP als MIME-Typ für. PHP-Dateien - aber es macht ein Entwickler Leben härter. Im versuchen, die Mime-Typ eines Bildes zu finden. PHP hat die Funktion getimagesize, aber das nimmt nur einen Dateinamen, während ich eine Bildressource stattdessen habe - d. h. ein Bild, das aus imagecreatefromstring erstellt wurde. Ich fand die Funktionen imagesx und bildhaft, die die Breitenhöhe von einer Ressource zurückgeben, aber ich kann keine Funktion finden, die mir den Mime-Typ aus einer Ressource erzählt. Jeder weiß von einer Möglichkeit, dies zu tun Hinweis: Wegen eines seltsamen Server-Setups können wir nicht lesen, schreiben Sie Dateien vom Server normalerweise, nur über eine FTP-Schicht (wo ist, wo ich die Bilddaten aus lesen). Gefragt am 5. Februar 10 um 12:21 Die Funktion imagefiletypefrombinary ist nicht fehlersicher. Manchmal wird eine Datei hochgeladen, aber der Mimetyp ist kein Bildtyp. Machen die pregmatch Fall unempfindlich durch Hinzufügen einer 39i39 nach dem Ende Vorwärts-Schrägstrich. (Machte die Änderung in oben Skript, aber müssen auf aproval warten) die Verwendung dieser Funktion ist eine gute, da nicht alle Webhosts können Sie Fileinfo oder Exif-Erweiterungen verwenden. Ndash SomeOne1 Jan 2 12 at 0:44 Natürlich ist es nicht fehlersicher. Es prüft nur den quotmagischen Bytesquot am Anfang der Bilddaten. Das Anlegen eines Quotchens an die Regex ist eine ziemlich schlechte Idee. Binärdateien haben keine Ahnung von quotcase awarenessquot. Ndash fireweasel Ein Bild, das mit imagecreatefromstring erstellt wurde, hat keinen MIME-Typ mehr, es wird aus seinem nativen Format decodiert und im GDs-internen Format gespeichert. Die gleiche Frage wurde eine Weile mit dem gleichen Ergebnis gefragt. Der einzige Weg, um zu gehen ist, um das Bild zu fangen, bevor es Bildschirmbild ausgespalten wird, und irgendwie fangen die Größeninformationen daraus. Sie sagen, dass Sie cant do Datei readwrite Operationen auf Ihrem System, so dass nur das Schreiben der Datei ist aus der Frage. Die Tatsache, dass getimagesize () cant lesen aus Variablen ist bekannt und beklagt: bugs. phpbug. phpid44239 Der Kerl dort erwähnt eine raffinierte Workaround: Registrieren eines neuen Stream-Wrapper, der Datei-Operationen auf Variablen ermöglicht. Ist dies eine Option auf Ihrem Server-Setup beantwortet Feb 5 10 um 12:29 Sorry, wie ich schon sagte, ich can39t readwrite Dateien auf den Server normal, so it39s nicht möglich, getimagesize verwenden, da es keinen Dateinamen gibt. EDIT: dude, es sei doch so ungeduldig, ich habe eine Erklärung geschrieben. ) Ndash DisgruntledGoat Feb 5 10 um 12:40 Can39t mit einer GD-Ressource nur getan werden, sorry. Aber wenn man sich von String ausbildet. Sie haben die ursprünglichen Daten an einem gewissen Punkt, richtig Warum nicht schreiben Sie es auf Festplatte und tun ein Getimagesize. Ich stimme es dumm zu, aber es macht den Job. EDIT: Das ist der Grund, warum ich zum erstenmal kommentiere und dann abstimme) Zweites Edit: Ah, du kannst auf die Festplatte schreiben. Und ich nehme es dir, den Ftp zu benutzen: 4747 Wrapper für imagesize () ndash Pekka Feb 5 10 um 12:41 FWIW, ich lief auch so gut. PHP 5.3 ist derzeit nicht verfügbar, also getimagesizefromstring () ist keine Option (noch ist FileInfo), und ich wollte die Implementierung mit dem VariableStream Wrapper nicht komplizieren. Das nächste Beste ist die Verwendung der Daten: 4747 Wrapper, mit dem Sie einen In-Memory-URI erstellen können, den getimagesize () lesen kann. Es optimiert auch die Anforderung, indem sie nur einen kleinen Teilstring der Binärdaten kodiert. Der Kern der Umsetzung ist hier: gist. github3751491 ndash Joe Sep 19 12 bei 19: 01mimecontenttype mit ltphp-Funktion detectFileMimeType (Dateiname) Dateiname escapeshellcmd (Dateiname) Befehlsdatei - b --mime-type - m usrsharemiscmagic mimeType shellexec (Befehl) return Trim (mimeType) gt sollte auf den meisten freigegebenen Linux-Hosts ohne Fehler arbeiten. Es sollte auch auf Windows-Hosts mit msysgit installiert arbeiten. Ltphp if (functionexists (mimecontenttype)) Funktion mimecontenttype (Dateiname) txt gt textplain, htm gt texthtml, html gt texthtml, php gt texthtml, css gt textcss, js gt applicationjavascript, json gt applicationjson, xml gt applicationxml, swf gt applicationx-shockwave - flash, flv gt videox-flv, bilder png gt bildpng, jpe gt imagejpeg, jpeg gt imagejpeg, jpg gt imagejpeg, gif gt imagegif, bmp gt bildbmp, ico gt imagevnd. microsoft. icon, tiff gt bildtiff, tif gt imagetiff, Svg gt imagesvgxml, svgz gt imagesvgxml, archiv zip gt applicationzip, rar gt applicationx-rar-komprimiert, exe gt applicationx-msdownload, msi gt applicationx-msdownload, cab gt applicationvnd. ms-cab-komprimiert, audiovideo mp3 gt audiompeg, qt gt Videoquicktime, mov gt videoquicktime, adobe pdf gt applicationpdf, psd gt imagevnd. adobe. photoshop, ai gt applicationpostscript, eps gt applicationpostscript, ps gt applicationpostscript, ms büro doc gt applicationmsword, rtf gt applicationrtf, xls gt applicationvnd. ms-excel, ppt Gt applicationvnd. ms-powerpoint, offenes Büro odt gt applicationvnd. oasis. opendocument. text, ods gt applicationvnd. oasis. opendocument. spreadsheet,) ext strtolower (arraypop (explodieren (.. filename))) if (arraykeyexists (ext. Mimetypen)) femlipen ft flosse (ftlnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn Mime. types Datei. Die in meiner vorherigen Einreichung, die seitdem durch diese ersetzt wurde, funktioniert nur ordnungsgemäß, wenn mime. types als Windows-Text formatiert ist. Die aktualisierte Version unten korrigiert dieses Problem. Danke an Mike, um dies zu zeigen. Ltphp-Funktion getmimetype (Dateiname mimePath ..etc) fileext substr (strrchr (Dateiname.), 1) if (leer (fileext)) return (false) regex (w -.) S (ws) (fileext s) i Zeilen Datei (mimePath mime. types) foreach (Zeilen als Zeile) if (substr (Zeile 0. 1)) weiter überspringen Kommentare Zeile rtrim (Zeile). If (pregmatch (regex. line-matches)) weiterhin keine Übereinstimmung mit der Erweiterung zurück (matches 1) return (false) no match at all gt Anmerkungen: 1 Benötigt mime. types Datei verteilt mit Apache (normalerweise bei ServerRootconfmime. types gefunden) . Wenn Sie Shared Hosting verwenden, laden Sie die Datei mit der Apache distro herunter und laden Sie sie dann in ein Verzeichnis auf Ihrem Webserver, auf den PHP zugreifen kann. 2 Erster Param ist der Dateiname (erforderlich). Zweiter Parameter ist Pfad zu mime. types Datei (optionale Vorgaben zu homeetc). 3 Basierend auf MIME-Typen, die bei IANA registriert sind (iana. orgassignmentsmedia-typesindex. html). Erkennt 630 Erweiterungen mit 498 MIME-Typen. 4 Bestätigt den MIME-Typ auf der Grundlage der Dateinamenerweiterung. Prüft nicht die eigentliche Datei die Datei muss nicht einmal existieren. 5 Anwendungsbeispiele: gtgt echo getmimetype (myFile. xml) gtgt applicationxml gtgt echo getmimetype (myPathmyFile. js) gtgt applicationjavascript gtgt echo getmimetype (myPresentation. ppt) gtgt applicationvnd. ms-powerpoint gtgt echo getmimetype (mySitemyPage. php) gtgt applicationx - Httpd-php gtgt echo getmimetype (myPicture. jpg) gtgt imagejpeg gtgt echo getmimetype (myMusic. mp3) gtgt audiompeg und so weiter. Um ein assoziatives Array mit MIME-Typen zu erstellen, verwenden Sie: ltphp-Funktion getmimearray (mimePath ..etc) regex (w -.) T (ws) i Zeilen-Datei (mimePath mime. types FILEIGNORENEWLINES) foreach (Zeilen als Zeile) if (substr (Zeile 0. 1)) Weiter springen Kommentare, wenn (Pregmatch (Regex. Line. Matchs)) weitergehen Mime-Typen ausführen beliebige Erweiterungen Mime-Matches 1 Erweiterungen explodieren (; matches 2) foreach (Erweiterungen als ext) mimeArray trim (ext) Mime-Rückkehr (mimeArray) gt Ich sehe eine Menge von Kommentaren, die darauf hindeuten, dass Dateierweiterung Schnüffeln (dh Annahme. jpg-Dateien sind JPEG-Bilder), wenn richtige File-Typ Sniffing-Funktionen nicht verfügbar sind. Ich möchte darauf hinweisen, dass es einen viel genaueren Weg gibt. Wenn weder mimecontenttype () noch Fileinfo für Sie verfügbar ist und Sie seit den 70er Jahren eine UNIX-Variante ausführen, einschließlich Mac OS, OS X, Linux usw. (und das meisten Web-Hosting ist), machen Sie einfach einen Systemaufruf zur Datei (1 ). So etwas tun: ltphp echo system (file - bi ltfile pathgt) gt wird so etwas wie texthtml charsetus-ascii ausgeben. Manche Systeme fügen nicht die Zeichensatz-Bit, sondern streifen es nur für den Fall. Das Bit ist wichtig. Allerdings können Sie einen Befehl wie folgt verwenden: ltphp echo system (file - b ltfile pathgt) ohne das i nach - b gt, um eine menschlich lesbare Zeichenfolge wie HTML-Dokumenttext auszugeben, die manchmal nützlich sein kann. Der einzige Nachteil ist, dass Ihre Skripte nicht auf Windows funktionieren, aber ist das so ein Problem Fast alle Web-Hosts verwenden eine UNIX. Es ist ein viel besserer Weg als nur die Dateierweiterung zu prüfen. Hier ist eine funktionierende Version einer Funktion, die die Mem-Typen aus in der Mime-Liste eingebauten Apaches abruft und ein Array erstellt, bei dem die Tasten die Dateierweiterungen sind: function generateUpToDateMimeArray (url) return array () mimes filegetcontents (svn. apache. orgreposasfhttpdhttpdtrunkdocsconfmime. (Vgl. Passend) exach split (, match2) foreach (exts as ext) returnextmatch1 return return typeMime generateUpToDateMimeArray () Echo typeMimegif Ich hatte auch Probleme mit dieser Funktion. Das Problem war, dass es fast immer Textplain zurückgeben würde. Echo iniget (mimemagic. magicfile) gibt etchttpdconfmagic Ich fand, dass ich die OS magic. mime Datei benötigt stattdessen. Sie können es entweder an den vorhandenen Speicherort kopieren oder Ihre php. ini aktualisieren, Sie können Iniset () nicht verwenden. Rootblade conf mv magic magic. old rootblade conf cp usrsharemagic. mime magic rootblade conf apachectl anmutig Hinweis: Sie werden sehen, dass ich anmutig neu gestartet Apache, um sicherzustellen, dass es beeinflusst hat. Vervollständigen lsome dude irgend irgendwo DOT comgt Kommentar: 0 String lt. Php applicationx-httpd-php und String-Erkennung auf Textdateien können fehlschlagen, wenn Sie eine Datei mit signiertem UTF-8 codieren überprüfen. Die UTF-8-Signatur ist ein Zwei-Byte-Code (0xFF 0xFE), der die Datei vorgibt, um die UTF-8-Erkennung zu erzwingen (Sie können sie auf einem hexadezimalen Editor überprüfen). Die Funktion mimecontenttype funktionierte nur für mich auf Microsoft Windows, nachdem ich die Anweisung mimemagic. debug zu meiner php. ini mit dem Wert von On hinzugefügt habe. Der Standardwert scheint ausgeschaltet zu sein. Exampe: mimemagic mimemagic. debug Auf mimemagic. magicfile c: phpextrasmagic. mimeDescription void header (string string, bool replace true, int httpresponsecode) header () wird verwendet, um einen rohen HTTP-Header zu senden. Weitere Informationen zu HTTP-Headern finden Sie in der Spezifikation des Bedrohungs-HTTP1.1. Denken Sie daran, dass Header () aufgerufen werden muss, bevor eine aktuelle Ausgabe gesendet wird, entweder durch normale HTML-Tags, leere Zeilen in einer Datei oder von PHP. Es ist ein sehr häufiger Fehler, Code mit include zu lesen. Oder erfordern Funktionen oder eine andere Dateizugriffsfunktion und haben Leerzeichen oder Leerzeilen, die ausgegeben werden, bevor header () aufgerufen wird. Das gleiche Problem besteht bei der Verwendung einer einzigen PHPHTML-Datei. Lthtmlgt ltphp Dies wird einen Fehler geben. Beachten Sie die Ausgabe oben, die vor dem Header () Anruf Header (Ort: Beispiel) exit gt Parameter Die Header-String ist. Es gibt zwei Special-Case-Header-Anrufe. Der erste ist ein Header, der mit dem String beginnt. HTTP quot (Fall ist nicht signifikant), der verwendet wird, um herauszufinden, den HTTP-Status-Code zu senden. Wenn Sie zum Beispiel Apache konfiguriert haben, um ein PHP-Skript zu verwenden, um Anfragen für fehlende Dateien zu behandeln (mit der ErrorDocument-Direktive), können Sie sicherstellen, dass Ihr Skript den richtigen Statuscode erzeugt. Ltphp header (HTTP1.0 404 nicht gefunden) gt Der zweite Sonderfall ist der quotLocation: header. Nicht nur, dass es diesen Header an den Browser zurücksendet, sondern auch einen REDIRECT (302) Statuscode an den Browser zurückgibt, es sei denn, der 201 oder ein 3xx Statuscode wurde bereits gesetzt. Ltphp-Header (Ort: Beispiel) Umleiten des Browsers Vergewissern Sie sich, dass der untenstehende Code bei der Umleitung nicht ausgeführt wird. Exit gt Der optionale Ersetzungsparameter gibt an, ob der Header einen vorherigen ähnlichen Header ersetzen oder einen zweiten Header desselben Typs hinzufügen soll. Standardmäßig wird es ersetzt, aber wenn du FALSE als zweites Argument passierst, kannst du mehrere Header des gleichen Typs erzwingen. Zum Beispiel: ltphp-Header (WWW-Authenticate: Negotiate) header (WWW-Authenticate: NTLM. False) gt Erzwingt den HTTP-Antwortcode auf den angegebenen Wert. Beachten Sie, dass dieser Parameter nur dann wirksam ist, wenn der String nicht leer ist. Es ist wichtig zu beachten, dass Header tatsächlich gesendet werden, wenn das erste Byte an den Browser ausgegeben wird. Wenn Sie Header in Ihren Skripten ersetzen, bedeutet dies, dass die Platzierung von echoprint-Anweisungen und Ausgabepuffern tatsächlich Auswirkungen auf die Header haben kann. Im Falle von Umleitungen, wenn Sie vergessen, Ihr Skript nach dem Senden des Headers zu beenden, kann das Hinzufügen eines Puffers oder das Senden eines Zeichens ändern, auf welche Seite Ihre Benutzer gesendet werden. Dies leitet zu 2.html um, da der zweite Header den ersten ersetzt. Ltphp header (location: 1.html) header (location: 2.html) ersetzt 1.html gt Dies leitet zu 1.html weiter, da der Header gesendet wird, sobald das Echo passiert. Sie sehen auch keine Header bereits Fehler, weil der Browser folgt der Umleitung, bevor es den Fehler anzeigen kann. Ltphp header (location: 1.html) echo send data header (location: 2.html) 1.html bereits gesendet gt Wrapping das vorherige Beispiel in einem Ausgangspuffer ändert tatsächlich das Verhalten des Skripts Dies ist, weil Header arent gesendet, bis die Ausgabe Puffer wird gespült Ltphp obstart () header (location: 1.html) echo send data header (location: 2.html) ersetzt 1.html obendflush () jetzt werden die header gesendet gt Meine Dateien sind in einem komprimierten Zustand (bz2). Wenn der Benutzer auf den Link klickt, möchte ich, dass sie die unkomprimierte Version der Datei bekommen. Nach dem Dekomprimieren der Datei lief ich in das Problem, dass der Download-Dialog immer auftauchen würde, auch wenn ich dem Dialog mitgeteilt habe, dass ich diesen Vorgang immer mit diesem Dateityp durchführen soll. Wie ich herausgefunden habe, war das Problem in der Kopfrichtlinie Content-Disposition, nämlich der Attachment-Richtlinie. Wenn Sie möchten, dass Ihr Browser eine einfache Verknüpfung zu einer Datei simuliert, ändern Sie die Anhänge in Inline oder lassen Sie sie ganz aus und gehen Sie gut aus. Das hat mir eine Weile gedauert, um herauszufinden, und ich hoffe es wird jemandem da draußen helfen, der in das gleiche Problem läuft. Sichern von PHP-Dateien in ANSI keine Lust, aber beim Speichern der Datei im UTF-8-Format aus verschiedenen Gründen erinnern, um die Datei ohne jede BOM (Byte-Order-Marke) zu speichern. Andernfalls wirst du das Problem der Header sehen, die nicht richtig gesendet werden. Ltphp header (Set-Cookie: nameuser) gt Würde so etwas wie folgt geben: - Warnung: Header-Informationen können nicht geändert werden - Header, die bereits gesendet wurden (Ausgabe gestartet bei C: wwwinfo. php: 1) in C: wwwinfo. php on line 1 Entsprechend Auf die RFC 6226 (tools. ietf. orghtmlrfc6266), die einzige Möglichkeit, Content-Disposition Header mit Codierung zu senden ist: Content-Disposition: Anhang Dateiname UTF-8e282ac20rates für Abwärtskompatibilität, was gesendet werden soll: Content-Disposition: attachment DateinameEURO Rate filenameutf-8e282ac20rates Als Ergebnis sollten wir ltphp Dateiname verwenden. exe ein Dateiname in chinesischen Zeichen contentDispositionField Content-Disposition: attachment. Sprintf (Dateinamen; rawurlencode (Dateiname)). Sprintf (filenameutf-8s. Rawurlencode (filename)) header (Content-Type: applicationoctet-stream) readfile (filetodownload. exe) gt Ich habe den Code in IE6-10, Firefox und Chrome getestet. Für große Dateien (100 MBs) habe ich festgestellt, dass es wichtig ist, den Dateiinhalt ASAP zu spülen, sonst wird der Download-Dialog nicht angezeigt, bis eine lange Zeit oder niemals. Ltphp-Header (Content-Disposition: Anhang Dateiname Urlencode (Datei)) Header (Content-Type: Applicationforce-Download) Header (Content-Type: Applicationoctet-Stream) Header (Content-Type: Anwendungsdownload) Header (Content-Beschreibung: Datei Transfer) Header (Content-Length: Dateigröße (Datei)) Flush () Das ist nicht wichtig. Fp fopen (datei r) während (fep (fp)) echo fread (fp. 65536) flush () das ist wichtig für große Downloads fclose (fp) gt Wenn du havent benutzt hast, kann HTTP Response 204 sehr bequem sein. 204 teilt dem Server mit, diese Anforderung sofort zu bestätigen. Dies ist hilfreich, wenn Sie eine Javascript - (oder ähnliche) Client-Side-Funktion wünschen, um eine serverseitige Funktion auszuführen, ohne die aktuelle Webseite zu aktualisieren oder zu ändern. (HTTP1.0 204 No Response) Ein Aufruf von sessionwriteclose () vor der Anweisung ltphp header (Ort: URL) exit (; ) Gt wird empfohlen, wenn Sie sicher sein wollen, dass die Sitzung aktualisiert wird, bevor Sie mit der Umleitung fortfahren. Wir haben eine Situation gefunden, in der das von der Umleitung zugegriffene Skript die Sitzung nicht korrekt geladen hat, da das Präzedenz-Skript nicht die Zeit hatte, es zu aktualisieren (wir verwendeten einen Datenbank-Handler). Nur um euch alle zu informieren, verwechselt nicht zwischen Content-Transfer-Encoding und Content-Encoding Content-Transfer-Encoding gibt die Codierung an, die verwendet wird, um die Daten im HTTP-Protokoll zu übertragen, wie zB raw binary oder base64. (Binär ist kompakter als base64. Base64 mit 33 Overhead). ZB Verwendung: - header (Content-Transfer-Encoding: binär) Content-Encoding wird verwendet, um Dinge wie die gzip-Komprimierung auf die contentdata anzuwenden. ZB Verwenden Sie: - header (Content-Encoding: gzip) Sie können HTTPs Etags und zuletzt geänderte Termine verwenden, um sicherzustellen, dass Sie die Browser-Daten, die sie bereits zwischengespeichert hat, nicht senden. Ltphp lastmodifiedtime filemtime (Datei) etag md5file (file) header (zuletzt modifiziert: gmdate (d, d MYH: i: s. Zuletzt modifiedtime) GMT) header (Etag: etag) if (strtotime (SERVER HTTPIFMODIFIEDSINCE) lastmodifiedtime trim ( SERVER HTTPIFNONEMATCH) etag) header (HTTP1.1 304 nicht modifiziert) exit gt Wenn du einen Header entfernen und ihn als Teil der Header-Antwort abschicken willst, gibt es nach dem Header-Namen nur den Header-Wert. Beispielsweise. PHP, standardmäßig, gibt immer den folgenden Header zurück: Welche Ihre gesamte Header-Antwort sieht aus wie HTTP1.1 200 OK Server: Apache2.2.11 (Unix) X-Powered-By: PHP5.2.8 Datum: Fr, 16 Okt 2009 23: 05:07 GMT Inhaltstyp: texthtml charsetUTF-8 Verbindung: schließen Wenn Sie den Header-Namen ohne Wert so nennen. Deine Header sehen jetzt so aus: HTTP1.1 200 OK Server: Apache2.2.11 (Unix) X-Powered-By: PHP5.2.8 Datum: Fr, 16 Okt 2009 23:05:07 GMT Verbindung: close Ich möchte nur hinzufügen , Da sehe ich hier viele falsche Formate. 1. Alle verwendeten Header haben erste Buchstaben Großbuchstaben, also musst du das folgen. Zum Beispiel: Ort, nicht Standort Content-Typ, nicht Content-Typ, noch INHALT-TYP 2. Dann muss es Colon und Space sein, wie gut: header (Content-Type: textplain) falsch: header (Content-Type: textplain ) 3. Ort header MUSS absolut uri mit Schema, Domain, Port, Pfad, etc. 4. Relative URIs sind NICHT erlaubt falsch: Location: something. phpa1 falsch: Location. A1 Es wird Proxy-Server und http-Clients glücklicher machen. Nach vielen Recherchen und Tests, Id gerne meine Ergebnisse über meine Probleme mit Internet Explorer und Datei Downloads zu teilen. Werfen Sie einen Blick auf diesen Code, der den normalen Download eines Javascript repliziert: ltphp if (strstr (SERVER HTTPUSERAGENT, MSIE) false) header (Content-type: textjavascript) header (Content-Disposition: inline filenamedownload. js) header (Inhalt (Content-Disposition: attachment filenamedownload. js) header (Content-Länge:. Dateigröße (my-file. js) Header (Content-Disposition: attachment filenamedownload. js) Header (Cache-Control: No-Cache) Header (Pragma: No-Cache) beinhalten (my-Cache) Header (Gültig bis: Fr, 01 Jan 2010 05:00:00 GMT), wenn (strstr (SERVER HTTPUSERAGENT, MSIE) File. js) gt Nun lass mich erklären: Ich fange an, wenn ich auf IE klicke, dann wenn ich nicht IE bin, setze ich Content-Typ (Groß - / Kleinschreibung beachten) auf JS und setze Content-Disposition ein (jeder Header ist von nun an Groß - und Kleinschreibung ) Zu Inline, weil die meisten Browser außerhalb von IE gerne JS Inline anzeigen. (Benutzer können Einstellungen ändern). Der Content-Length-Header wird von einigen Browsern benötigt, um das Download-Feld zu aktivieren. Dann, wenn es IE ist, ist der Applicationforce-Download Content-Typ manchmal erforderlich, um das Download-Feld zu zeigen. Verwenden Sie dies, wenn Sie nicht möchten, dass Ihr PDF im Browser (im IE) angezeigt wird. Ich benutze es hier, um sicherzustellen, dass sich die Box öffnet. Wie auch immer, ich setze die Content-Disposition an die Anlage, weil ich schon weiß, dass die Box erscheint. Dann habe ich wieder die Content-Length. Jetzt, heres mein großer Punkt. Ich habe die Cache-Control und Pragma Header nur geschickt, wenn nicht IE. DIESE HEADERS WERDEN DOWNLOAD AUF IE VERMEIDEN. Verwenden Sie nur den Wähler-Header, schließlich verlangt es, dass die Datei beim nächsten Mal wieder heruntergeladen wird. Dies ist kein Bug IE speichert Downloads im Ordner "Temporary Internet Files", bis der Download abgeschlossen ist. Ich weiß das, weil ich einmal eine riesige Datei auf meine Dokumente heruntergeladen habe, aber das Download-Dialogfeld legte es in den Temp-Ordner und verschob es am Ende. Denken Sie nur darüber nach. Wenn IE verlangt, dass die Datei in den Temp-Ordner heruntergeladen wird, wird die Einstellung der Cache-Control - und Pragma-Header zu einem Fehler führen. Ich hoffe das spart jemand etwas Zeit Hier ist ein PHP-Skript, das ich geschrieben habe, um eine Datei zu streamen und sie mit einer xor-Operation zu verschlüsseln Auf den Bytes und mit einem Schlüssel. Die Verschlüsselung funktioniert sehr gut, aber die Geschwindigkeit verringert sich um 2, es ist jetzt 520KiBs. Der Benutzer wird nun nach einem md5-Passwort gefragt (anstatt es direkt im Code zu halten). Es gibt einen Teil in Französisch, weil seine meine Muttersprache so ändern, wie Sie wollen. Ltphp Stream-Dateien und verschlüsseln die Daten on-the-fly Einstellungen - Datei zum Streamen Datei FILEout - Lesen Puffer Pufferlänge 3840 - Schlüssel in hex keychar 9cdfb439c7876e703e307864c9167a15 Funktion: Konvertierung hex Schlüssel in einer Zeichenfolge in binäre Funktion hex2bin (h) if ( Isstring (h)) return null r array () für (a 0 (a 2) lt strlen (h) a) ta hexdec (h 2 a) tb hexdec (h (2 a 1)) ra (int) ((ta Ltlt 4) tb) return r Funktion zum Senden der Auth-Header-Funktion askPassword (Text Geben Sie das Passwort ein) header (WWW-Authenticate: Basic Realm. Utf8decode (Text).) Header (HTTP1.0 401 Unautorisiert) return 1 Key wird gefragt Der erste Start, wenn (isset (SERVER PHPAUTHPW)) askPassword () Echo Une cl est ncessaire ltbr gt exit Holen Sie sich den Schlüssel in hex keychar SERVER PHPAUTHPW Konvertieren Schlüssel und legen Sie die Größe der Taste Schlüssel hex2bin (Keychar) Keylength Count (Key) Teste Si la cl est valide en hex if (Schlüsselschlüssellänge lt 4) askPassword (Cl incorrecte) Echo Cl incorrecte ltbr gt exit () Teste si la cl est de longueur düne puissance de 2 if ((keylength 2) 0) askPassword (Cl de Langzeitverkürzung (multiple de 2 uniquement)) Echo Cl de longueur incorrecte (puissance de 2 uniquement) ltbr gt exit () Header-Header (Content-Type: Applicationoctet-Stream) Header (Content-Transfer-Encoding: binärer) Header (Content - Länge:. Dateigröße (Datei). ) Header (filename. File.) Flush () das ist nicht wirklich wichtig. Öffnen der Datei im schreibgeschützten fp fopen (Datei r) while (feof (fp)) Lesen einer Puffergröße des Dateipuffers fread (fp. Pufferlänge) j 0 für (i 0 i lt Pufferlänge i) Der Schlüssel wird gelesen In der Schleife, um die ganze Datei zu verschlüsseln, wenn (i keylength 0) j 0 eine xor-Operation zwischen dem Schlüssel und der Datei anwenden, um zu kryptieren Dieser Vorgang isst eine Menge CPU-Zeit (Stream bei 1MiBs auf meinem Server Intel E2180) tmp pack (C. Schlüssel j) bufferE (Puffer i tmp) lt Le fameux XOR Sende den verschlüsselten Daten-Echo-Puffer ein Puffer speichern p-Puffer bush () Dies ist für große Downloads wichtig. Fclose (fp) exit () Schließen Sie die Datei und ihre fertigen fclose (fp ) VERMEIDEN SIE ZERO BYTE ORDER MARK Header MUSS vor ALLES auf der Seite gesendet werden. Sogar ein einziger Raum wird dein Skript brechen. In meinem Fall gab es BOM in die Codierung gesetzt, also habe ich die Datei mit Notepad geöffnet und die Codierung auf UTF-8 (keine Stückliste) und voila gesetzt, alles funktioniert jetzt super. Ich habe lange versucht, festzustellen, warum Internet Explorer 7 nicht den Benutzer auffordert, einen Download zu speichern, der auf dem Dateinamen basiert, der auf einem Content-Disposition: attachment Dateiname angegeben ist. Kopfzeile. Ich habe schließlich festgestellt, dass meine Apache-Installation einen zusätzlichen Header hinzufügte: Vary: Host, der IE geworfen hat - wie pro support. microsoftkb824847 fand ich manuelles Festlegen des Vary-Headers aus PHP wie folgt Header (Vary: User-Agent) IE erlaubt Verhalten sich wie beabsichtigt Hoffe das spart jemand anderes etwas, die Codierung einer Datei wird vom Content-Type entdeckt, entweder im HTML-Meta-Tag oder als Teil des HTTP-Headers. So benötigt der Server und der Browser keine Unicode-Datei, um mit einer Stücklistenmarke zu beginnen. Stücklisten können auch nix-Systeme verwechseln. Weitere Informationen unter unicode. orgfaqutfbom. htmlbom1 Auf einer anderen Anmerkung: Safari kann CMYK-Bilder anzeigen (zumindest die OS X-Version, da sie die Dienste von QuickTime verwendet) Einstellen eines Location-Headers gibt einen REDIRECT (302) Statuscode an den Browser zurück, 201 oder ein 3xx Statuscode wurde bereits gesetzt. Wenn Sie eine Antwort auf eine POST-Anfrage senden, können Sie sich die RFC 2616 Abschnitte 10.3.3 und 10.3.4 anschauen. Es wird vorgeschlagen, dass, wenn Sie möchten, dass der Browser sofort die Ressource in der Location-Header in diesem Umstand, sollten Sie einen 303 Status-Code nicht die 302 (mit dem gleichen Link wie Hypertext im Körper für sehr alte Browser). Dies kann (seltene) Konsequenzen haben, wie in Bug 42969 erwähnt.

No comments:

Post a Comment