Umgang mit Binärdaten mit Axis2 (MTOMSwA) Einleitung Trotz Flexibilität, Interoperabilität und globaler Akzeptanz von XML gibt es Zeiten, in denen Serialisierung von Daten in XML nicht sinnvoll ist. Web-Services-Benutzer können Binär-Attachments von verschiedenen Sorten wie Bilder, Zeichnungen, XML-Dokumente usw. zusammen mit einer SOAP-Nachricht übertragen. Solche Daten sind oft in einem bestimmten Binärformat. Traditionell wurden zwei Techniken für den Umgang mit opaken Daten in XML verwendet. Das Senden von binären Daten durch den Wert wird durch Einbettung von opaken Daten (natürlich nach irgendeiner Form von Codierung) als Element - oder Attributinhalt der XML-Komponente von Daten erreicht. Der Hauptvorteil dieser Technik ist, dass es Anwendungen die Möglichkeit gibt, Daten zu verarbeiten und zu beschreiben, die nur auf der XML-Komponente der Daten basieren. XML unterstützt undurchsichtige Daten als Inhalt durch die Verwendung von entweder base64 oder hexadezimaler Textcodierung. Beide Techniken blasen die Größe der Daten auf. Für die UTF-8-zugrunde liegende Textcodierung erhöht die Base64-Codierung die Größe der Binärdaten um einen Faktor von 1,33x der ursprünglichen Größe, während die Hexadezimalcodierung Daten um den Faktor 2x erweitert. Die obigen Faktoren werden verdoppelt, wenn UTF-16 Textcodierung verwendet wird. Auch von besorgniserregend ist der Overhead in den Bearbeitungskosten (sowohl real als auch wahrgenommen) für diese Formate, vor allem bei der Dekodierung wieder in rohe Binärdatei. Das Senden von Binärdaten durch Referenz wird durch das Anfügen von reinen Binärdaten als externe, nicht gepardete allgemeine Entitäten außerhalb des XML-Dokuments und anschließendes Einbetten von Referenz-URIs an diese Entitäten als Elemente oder Attributwerte erreicht. Dies verhindert das unnötige Aufblasen von Daten und Verschwendung von Rechenleistung. Das primäre Hindernis für die Nutzung dieser unparsed Entities ist ihre starke Abhängigkeit von DTDs, die Modularität sowie die Verwendung von XML-Namespaces beeinträchtigt. Es gab mehrere Spezifikationen, die in der Web-Service-Welt eingeführt wurden, um mit diesem binären Attachment-Problem unter Verwendung der quotby-Referenzquot-Technik umzugehen. SOAP mit Attachments ist ein solches Beispiel. Da SOAP Dokumenttyp-Deklarationen (DTD) in Meldungen verbietet, führt dies zu dem Problem, Daten nicht als Teil des Meldungs-Infosets darzustellen und damit zwei Datenmodelle zu erzeugen. Dieses Szenario ist wie das Senden von Anhängen mit einer E-Mail-Nachricht. Auch wenn diese Anhänge mit dem Nachrichteninhalt zusammenhängen, sind sie nicht in der Nachricht. Dies führt dazu, dass die Technologien, die die Daten auf der Grundlage der XML-Komponente der Daten verarbeiten und beschreiben, zu Fehlfunktionen führen. Ein Beispiel ist WS-Security. Wo ist MTOM Come In MTOM (SOAP Message Transmission Optimization Mechanism) ist eine weitere Spezifikation, die auf die Lösung der quotAttachmentsquot Problem konzentriert. MTOM versucht, die Vorteile der beiden oben genannten Techniken zu nutzen, indem man versucht, die beiden Techniken zusammenzuführen. MTOM ist eigentlich ein quotby-Referenzquot-Verfahren. Das Drahtformat einer MTOM-optimierten Nachricht ist dasselbe wie die SOAP mit Attachments-Nachricht, die es auch rückwärts kompatibel mit SwA-Endpunkten macht. Das bemerkenswerteste Merkmal von MTOM ist die Verwendung des XOP: Include-Elements, das in der XML Binary Optimized Packaging (XOP) - Spezifikation definiert ist, um auf die binären Attachments (externe ungepufferte allgemeine Entitäten) der Nachricht zu verweisen. Mit der Verwendung dieses exklusiven Elements wird der angehängte Binärinhalt logisch inline (mit dem Wert) mit dem SOAP-Dokument, obwohl er tatsächlich separat angehängt ist. Dies verschmilzt die beiden Bereiche, indem es möglich ist, nur mit einem Datenmodell zu arbeiten. Dies ermöglicht es den Anwendungen zu verarbeiten und zu beschreiben, indem man nur den XML-Teil betrachtet, wodurch die Abhängigkeit von DTDs veraltet ist. Auf einer leichteren Note hat MTOM den Referenzmechanismus von SwA standardisiert. Das folgende ist ein Auszug aus der XOP-Spezifikation. Auf der konzeptionellen Ebene können diese Binärdaten als Basis64-codiert im XML-Dokument betrachtet werden. Da diese konzeptionelle Form bei einer Verarbeitung des XML-Dokuments erforderlich ist (z. B. zum Signieren des XML-Dokuments), ist es notwendig, eine Eins-zu-Eins-Korrespondenz zwischen XML-Infosets und XOP-Paketen zu haben. Daher ist die konzeptionelle Darstellung solcher Binärdaten so, als wäre sie base64-codiert, wobei die kanonische lexikalische Form des XML-Schema base64Binary-Datentyps verwendet wurde (siehe XML-Schema Teil 2: Datentypen Second Edition 3.2.16 base64Binary). In umgekehrter Richtung ist XOP in der Lage, nur base64-codierte Infoset-Daten zu optimieren, die in der kanonischen lexikalischen Form vorliegen. Apache Axis2 unterstützt Base64-Codierung. SOAP mit Attachments und MTOM (SOAP Message Transmission Optimization Mechanism). MTOM mit Axis2 Programmiermodell AXIOM ist (und kann das erste) Objektmodell sein, das die Fähigkeit hat, binäre Daten zu halten. Es hat diese Fähigkeit, wie OMText rohen binären Inhalt in Form von javax. activation. DataHandler halten kann. OMText wurde zu diesem Zweck aus zwei Gründen ausgewählt. Einer ist, dass XOP (MTOM) in der Lage ist, nur base64-codierte Infoset-Daten zu optimieren, die sich in der kanonischen lexikalischen Form des XML-Schema base64Binary-Datentyps befinden. Anderes ist, das Infoset sowohl im Sender als auch im Empfänger zu bewahren. (Um den Binärinhalt in der gleichen Art von Objekt zu speichern, unabhängig davon, ob es optimiert ist oder nicht). MTOM ermöglicht die selektive Verschlüsselung von Teilen der Nachricht, die es uns ermöglicht, basendecodierte Daten sowie extern angehängte rohe Binärdaten zu senden, die durch das in einer SOAP-Nachricht zu sendende quotXOPquot-Element (optimierter Inhalt) referenziert werden. Sie können festlegen, ob ein OMText-Knoten, der rohe Binärdaten oder base64encodierte Binärdaten enthält, qualifiziert ist, um zum Zeitpunkt des Aufbaus dieses Knotens oder später optimiert zu werden. Für eine optimale Effizienz von MTOM empfiehlt es sich, kleinere Binär-Anhänge mit Base64encoding (nicht optimiert) und größeren Anhängen als optimierten Inhalt zu versenden. Außerdem kann ein Benutzer einen optimierbaren Binärinhaltsknoten unter Verwendung eines base64-codierten Strings erstellen, der einen codierten Binärinhalt enthält, der mit dem MIME-Typ der tatsächlichen Binärdarstellung versehen ist. Axis2 verwendet javax. activation. DataHandler, um die Binärdaten zu verarbeiten. Alle optimierten Binärinhaltsknoten werden als Base64-Strings serialisiert, wenn quotMTOM nicht aktiviert ist. Sie können auch binäre Content-Knoten erstellen, die auf keinen Fall optimiert werden. Sie werden serialisiert und als Base64 Strings gesendet. Aktivieren der MTOM-Optimierung auf der Client-Seite In Optionen setzen Sie die quotenableMTOMquot-Eigenschaft auf True beim Senden von Nachrichten. Wenn diese Eigenschaft auf True gesetzt ist, wird jede SOAP-Hüllkurve, unabhängig davon, ob sie einen optimierbaren Inhalt enthält oder nicht, als MTOM-optimierte MIME-Nachricht serialisiert. Axis2 serialisiert alle Binär-Content-Knoten als Base64-codierte Strings, unabhängig davon, ob sie qualifiziert sind, um optimiert zu werden oder nicht, wenn die quotenableMTOMquot-Eigenschaft auf False gesetzt ist. Wenn der Umschlag enthält Elementinformationen des Namens xop: Include (siehe XML-Binär optimierte Verpackung 3. XOP Infosets Constructs). Der Benutzer muss nichts angeben, damit Axis2 MTOM-optimierte Nachrichten empfangen kann. Axis2 identifiziert und de-serialisiert entsprechend, wie und wann eine MTOM-Nachricht eintrifft. Aktivieren der MTOM-Optimierung auf der Serverseite Der Axis 2-Server identifiziert automatisch eingehende MTOM-optimierte Meldungen basierend auf dem Content-Typ und de-serialisiert sie entsprechend. Der Benutzer kannMTOM auf der Serverseite für ausgehende Nachrichten aktivieren, Um MTOM global für alle Dienste zu aktivieren, können Benutzer den quotenableMTOMquot-Parameter in der Axis2.xml auf True setzen. Wenn es gesetzt ist, werden alle ausgehenden Nachrichten serialisiert und als MTOM-optimierte MIME-Nachrichten gesendet. Wenn es nicht gesetzt ist, werden alle Binärdaten in den Binärinhaltsknoten als Base64-codierte Zeichenfolgen serialisiert. Diese Konfiguration kann in services. xml auf der Basis von pro Service und pro Operation überschrieben werden. Sie müssen den Server nach der Einstellung dieses Parameters neu starten. Zugriff auf empfangene Binärdaten (Beispielcode) Im Schreiben eines einfachen Webservers in Python, der es einem Benutzer ermöglicht, eine Datei mit Multipartform-Daten hochzuladen. Soweit ich sagen kann, werden Multipart-MIME-Daten linienbasiert sein. Zum Beispiel muss die Grenze am Anfang einer Linie sein. Ich kann nicht herausfinden, wie Binärdaten in dieser Hinsicht behandelt werden. Mein Client (Firefox) kodiert es nicht in 7bit ASCII oder irgendetwas, seine nur rohen Binärdaten sein Senden. Ist es aufgeteilt die Daten in Zeilen an beliebigen Orten Gibt es eine maximale Zeilenlänge für Multipart-Daten angegeben Ive versucht, durch die RFC für Multipartform-Daten suchen, aber nichts gefunden. Fragte Mar 27 13 um 16:54 Nach dem Graben durch die RFCs, ich glaube ich habe endlich alles in meinem Kopf. Die Körperteile (d. h. der Körpergehalt eines einzelnen Teils in einer mehrteiligen Nachricht) müssen nur so sein, daß die Grenze am Ende des Teils mit einer CRLF beginnt. Andernfalls müssen die Daten nicht linienbasiert sein, und wenn der Inhalt in diesem Fall Zeilenumbrüche hat, gibt es keinen maximalen Abstand zwischen ihnen, noch müssen sie in irgendeiner Weise entkommen sein (gut, wenn nicht vielleicht die Content-Transfer - Encoding ist zitiert-String). Die 7-Bit-, 8-Bit - und Binäroptionen für Content-Transfer-Encoding zeigen nicht wirklich an, dass irgendeine Codierung auf den Daten durchgeführt wurde (und daher keine Codierung rückgängig gemacht werden muss), sie sind nur dazu gedacht, die Art der Daten anzugeben Sie können erwarten, im Körperteil zu sehen. Was ich in meiner schlecht ausgedrückten Frage wirklich bekam, war, wie man die Daten aus der Steckdose lernte, damit ich sicher sein konnte, dass ich die Grenze erwischte und ohne einen beliebig großen Puffer zu haben musste (zB wenn es keine Zeilenumbrüche gab Der Inhalt, und so eine readline bis zum Pufferung der ganzen Sache). Was ich am Ende tat, war die Pufferung aus der Steckdose mit einer Leseleitung mit einer maximalen Länge, so dass der Puffer würde nie länger als das sein, aber würde auch sicherstellen, zu beenden, wenn ein Zeilenumbruch angetroffen wurde. Dies stellte sicher, dass, wenn die Grenze kam (nach einem CRLF), wäre es am Anfang des Puffers. Ich musste ein bisschen extra monkeying herum, um sicherzustellen, dass ich nicht enthalten, dass endgültige CRLF in den tatsächlichen Körper Inhalt, weil nach dem RFC seine erforderlich vor der Grenze, und daher nicht Teil des Inhalts selbst. Beantwortet Apr 5 13 um 12:02 Versuchen Sie, RFC 2045 zu überprüfen. Typischerweise wird binärer Inhalt von Ihrer Anwendung in BASE64 umgewandelt und in der Multi-Part-Nachricht mit Content-Transfer-Encoding aufgenommen. Base64 Es gibt andere Mechanismen, um binäre Daten zu übertragen, aber das ist ziemlich häufig. Binäre Daten werden in Oktette umgewandelt und in beliebigen Längenfolgen ausgeteilt (abhängig von der Codierungsvariante - siehe BASE64 Link oben). Die empfangende Anwendung decodiert sie dann in den ursprünglichen Binärinhalt. Ich bin kein Python-Programmierer, aber ich wäre überrascht, dass du das wirklich selbst beherrschen musst. Ich vermute, es gibt vorgebaute Python-Bibliotheksfunktionen, um dies für Sie zu tun. Antwortete Mar 27 13 um 17:43 Danke, ich war auf der Suche nach einem anderen RFC, die nicht so informativ war. Ich habe auch gefunden RFC 2046, die spezifisch definiert mehrteilige Nachrichten in Abschnitt 5. Notieren Sie dort39s ein bisschen eine Subtilität in diesen RFCs, die durch mich aus: es heißt, multipart Nachrichten können keine anderen Kodierungen als 7-Bit, 8-Bit und binär (Dh nicht Base-64). Allerdings geht es weiter darauf hin, dass die einzelnen Teile innerhalb des Multi-Parts dort eigene Content-Codierungen haben können, also sind Sie richtig, dass Base-64 möglich ist. Ndash brianmearns 28. März um 13:20 Ihre Antwort 2017 Stack Exchange, IncDescription 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 einfach nichts als Header-Wert nach dem Header-Namen. 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.
Comments
Post a Comment