Content transfer encoding binary opties




Content transfer encoding binary optiesBehandeling van binaire gegevens met Axis2 (MTOMSwA) Inleiding Ondanks de flexibiliteit, interoperabiliteit en wereldwijde acceptatie van XML, zijn er tijden waarin het sorteren van gegevens in XML niet zinvol is. Gebruikers van de webdienst kunnen binaire bijlagen van verschillende soorten zoals afbeeldingen, tekeningen, XML-documenten, enz. Samenzenden met een SOAP-bericht. Dergelijke gegevens zijn vaak in een bepaald binair formaat. Traditioneel zijn er twee technieken gebruikt voor het omgaan met ondoorzichtige data in XML. Verzenden van binaire gegevens, door waarde te behalen wordt door onbedekte data (uiteraard na een of andere vorm van codering) ingebed als een element of attribuut inhoud van het XML-bestanddeel van data. Het belangrijkste voordeel van deze techniek is dat het applicaties de mogelijkheid geeft om gegevens te verwerken en te beschrijven, uitsluitend gebaseerd op het XML-bestanddeel van de data. XML ondersteunt ondoorzichtige data als inhoud door middel van base64 of hexadecimale tekstcodering. Beide technieken bloeden de grootte van de gegevens. Voor de onderliggende tekstcodering UTF-8 verhoogt base64-codering de grootte van de binaire gegevens met een factor van 1,33x van de oorspronkelijke grootte, terwijl hexadecimale codering data met een factor van 2x vergroot. De bovenstaande factoren worden verdubbeld als UTF-16 tekstcodering wordt gebruikt. Ook van belang is de overhead in verwerkingskosten (zowel echt als waargenomen) voor deze formaten, vooral bij het decoderen van terug naar rauwe binaire. Het verzenden van binaire gegevens door referentie wordt bereikt door pure binaire gegevens als externe ongeparkeerde algemene entiteiten buiten het XML-document te koppelen en vervolgens referentie-URI's te integreren in die entiteiten als elementen of attribuutwaarden. Dit voorkomt onnodige opblazen van gegevens en verspilling van verwerkingscapaciteit. Het voornaamste obstakel voor het gebruik van deze ongeparsde entiteiten is hun sterke afhankelijkheid van DTD's, waardoor de modulariteit en het gebruik van XML namespaces worden belemmerd. Er waren verschillende specificaties geintroduceerd in de webdienstwereld om dit binaire bijlageprobleem aan te pakken met behulp van de quotby referencequot-techniek. SOAP with Attachments is een dergelijk voorbeeld. Aangezien SOAP documentdocumenten (DTD) in berichten verbiedt, leidt dit tot het probleem van het niet vertegenwoordigen van gegevens als onderdeel van het bericht infoset, waardoor twee data-modellen worden gecreeerd. Dit scenario is als het versturen van bijlagen met een e-mailbericht. Hoewel deze bijlagen verband houden met de berichtinhoud, zijn ze niet binnen het bericht. Dit veroorzaakt de technologieen die de gegevens verwerken en beschrijven op basis van de XML-component van de data naar storing. Een voorbeeld hiervan is WS-Security. Waar komt MTOM in MTOM (SOAP Message Transmission Optimization Mechanism) een andere specificatie die zich richt op het oplossen van het quotAttachmentsquot-probleem. MTOM probeert de voordelen van de bovenstaande twee technieken te benutten door te proberen de twee technieken samen te voegen. MTOM is eigenlijk een quotisch referentiequot-methode. Het draadformaat van een MTOM-geoptimaliseerd bericht is hetzelfde als het SOAP met Attachments-bericht, waardoor het ook achteruit compatibel is met SwA-eindpunten. Het meest opvallende kenmerk van MTOM is het gebruik van het XOP: Include-element, dat is gedefinieerd in de XML Binary Optimized Packaging (XOP) - specificatie om de binaire bijlagen (externe ongeparkeerde algemene entiteiten) van het bericht te verwijzen. Met behulp van dit exclusieve element wordt de bijgevoegde binaire inhoud logisch inline (per waarde) met het SOAP-document, hoewel het eigenlijk apart is aangesloten. Hiermee worden de twee rijken samengevoegd door het alleen mogelijk te maken met een data-model. Dit stelt de applicaties in staat om te verwerken en te beschrijven door alleen naar het XML-deel te kijken, waardoor de vertrouwen op DTD's verouderd zijn. Op een lichtere noot heeft MTOM het referentiemechanisme van SwA gestandaardiseerd. Het volgende is een uittreksel uit de XOP-specificatie. Op het conceptuele niveau kunnen deze binaire gegevens worden beschouwd als base64-gecodeerd in het XML Document. Aangezien dit conceptuele formulier nodig zou zijn tijdens een verwerking van het XML-document (bijvoorbeeld voor het ondertekenen van het XML-document), is het nodig een een-op-een correspondentie tussen XML Infosets en XOP Packages te hebben. Daarom is de conceptuele weergave van dergelijke binaire gegevens alsof het base64-gecodeerd was, met behulp van de kanonieke lexicale vorm van het XML Schema base64Binary datatype (zie XML Schema Part 2: Datatypes Second Edition 3.2.16 base64Binary). In de omgekeerde richting kan XOP alleen basis64-gecodeerde Infoset-gegevens optimaliseren die in de kanonieke lexicale vorm zijn. Apache Axis2 ondersteunt Base64-codering. SOAP met bijlagen en MTOM (SOAP Message Transmission Optimization Mechanism). MTOM met Axis2 Programming Model AXIOM is (en is het eerste) Object Model dat de mogelijkheid heeft om binaire gegevens te houden. Het heeft deze mogelijkheid, aangezien OMText ruwe binaire inhoud kan bevatten in de vorm van javax. activation. DataHandler. OMText is hiervoor om twee redenen gekozen. Een is dat XOP (MTOM) in staat is om alleen base64-gecodeerde Infoset-gegevens te optimaliseren die in de kanonieke lexicale vorm van XML Schema base64Binary datatype zijn. Een ander is het bewaren van de infoset in zowel de afzender als de ontvanger. (Om de binaire inhoud op te slaan in hetzelfde soort object, ongeacht of het geoptimaliseerd is of niet). MTOM maakt het mogelijk om gedeelten van het bericht selectief te coderen, waardoor we basis64-gecodeerde gegevens kunnen versturen, evenals extern aangesloten ruwe binaire gegevens die worden verwezen naar het quotXOPquot-element (geoptimaliseerde inhoud) die in een SOAP-bericht moet worden verzonden. U kunt specificeren of een OMText-knooppunt dat ruwe binaire gegevens of basis64-gecodeerde binaire gegevens bevat, gekwalificeerd is om te worden geoptimaliseerd op het moment van de bouw van dat knooppunt of later. Voor een optimale efficientie van MTOM, wordt een gebruiker geadviseerd kleinere binaire bijlagen te verzenden met behulp van base64encoding (niet geoptimaliseerde) en grotere bijlagen als geoptimaliseerde inhoud. Ook kan een gebruiker een optimaal binair inhoudsnode maken met behulp van een base64 gecodeerde tekenreeks, die gecodeerde binaire inhoud bevat, gegeven met het MIME-type van de werkelijke binaire representatie. Axis2 gebruikt javax. activation. DataHandler om de binaire gegevens te verwerken. Alle geoptimaliseerde binaire inhoudknooppunten worden serialized als Base64 Strings als quotMTOM niet enabledquot is. U kunt ook binaire content knooppunten maken, die in elk geval niet geoptimaliseerd worden. Ze worden serialized en verzonden als Base64 Strings. Optimalisatie van MTOM op de clientzijde in Opties, stel de quotenableMTOMquot-eigenschap in op True wanneer u berichten verzendt. Wanneer deze eigenschap is ingesteld op True, zal elke SOAP-envelop, ongeacht of het optimale inhoud bevat of niet, worden geprogrammeerd als een MTOM-geoptimaliseerd MIME-bericht. Axis2 serialiseert alle binaire content nodes als Base64 gecodeerde strings, ongeacht of ze gekwalificeerd zijn om geoptimaliseerd te worden of niet als de quotenableMTOMquot eigenschap is ingesteld op False. Als de envelop elementenelementen bevat van de naam xop: Include (zie XML-binary Optimized Packaging 3. XOP Infosets Constructs). De gebruiker hoeft niets te specificeren, zodat Axis2 MTOM-geoptimaliseerde berichten kan ontvangen. Axis2 zal daar automatisch automatisch identificeren en afstellen, als en wanneer een MTOM-bericht komt. MTOM-optimalisatie inschakelen op de serverzijde De Axis 2-server identificeert automatisch inkomende MTOM-geoptimaliseerde berichten, gebaseerd op het inhoudstype, en hiermee wordt ze automatisch geherialiseerd. De gebruiker kan enableMTOM op de serverzijde voor uitgaande berichten, om globaal te enableMTOM voor alle services, kunnen gebruikers de quotableMTOMquot-parameter instellen op True in de Axis2.xml. Wanneer deze is ingesteld, worden alle uitgaande berichten serieus en verzonden als MTOM-geoptimaliseerde MIME-berichten. Als deze niet is ingesteld, worden alle binaire gegevens in de binaire inhoudknooppunten genummerd als Base64-gecodeerde strings. Deze configuratie kan worden overschreden in services. xml op basis van per service en per operatie. U moet de server opnieuw starten nadat deze parameter is ingesteld. Toegang tot ontvangen binaire gegevens (voorbeeldcode) Ik schrijf een eenvoudige webserver in python waarmee een gebruiker een bestand kunt uploaden met behulp van multipartform-data. Voor zover ik kan vertellen, moet veelvoudige MIME-data line-based zijn. Bijvoorbeeld, de grens moet aan het begin van een lijn staan. Ik kan er niet uitzien hoe binaire gegevens in dit verband worden behandeld. Mijn client (Firefox) codeert het niet in 7bit ASCII of iets, het is gewoon rauwe binaire data die het verzendt. Gedeelt het de gegevens in lijnen op willekeurige locaties Is er een maximale lijnlengte die is opgegeven voor multipartdata? Ik heb de RFC voor multipartform-data doorzocht, maar vond niets. Gevraagd Mar 27 13 om 16:54 Na het graven door de RFC's, denk ik dat ik eindelijk alles helemaal in mijn hoofd heb gekregen. De lichaamsdelen (dat wil zeggen de lichaamsinhoud van een individueel deel in een multipartbericht) hoeven alleen line-based te zijn, omdat de grens aan het einde van het deel begint met een CRLF. Maar anders hoeven de gegevens niet op line-based te zijn, en als de inhoud er lacunes in bestaat, is er geen maximale afstand tussen hen, en ze moeten in ieder geval ook niet worden ontsnapt (alstublieft, tenzij de Content-Transfer - Codering is geciteerd-string). De 7-bits, 8-bits en binaire opties voor Content-Transfer-Encoding geven eigenlijk niet aan dat er op de data een codering is uitgevoerd (en daarom moet geen codering worden ongedaan gemaakt), ze zijn gewoon bedoeld om het type gegevens aan te geven Je kunt verwachten in het lichaamsdeel te zien. Wat ik in mijn slecht uitgedrukte vraag realiseerde, was hoe ik de gegevens van de socket moest lezen, zodat ik er zeker van kon zijn dat ik de grens had gevangen en zonder een willekeurig grote buffer te hebben (bijvoorbeeld als er geen speling was in De inhoud, en dus een leeslijn belandde het hele ding te bufferen). Wat ik uiteindelijk doeerde was van de stopcontact buffering met een leeslijn met een maximale lengte, dus de buffer zou nooit langer zijn dan dat, maar zou er ook voor zorgen dat je beeindigt als er een linebreak was. Dit zorgde ervoor dat wanneer de grens kwam (na een CRLF), zou het aan het begin van de buffer zijn. Ik moest een beetje extra monkeying doen om ervoor te zorgen dat ik dat laatste CRLF niet had opgenomen in de eigenlijke inhoud van het lichaam, omdat volgens de RFC het nodig was voor de grens en dus geen deel van de inhoud zelf. Beantwoord op 5 april 13 om 12:02 Probeer het overzetten van RFC 2045. Typisch wordt binaire inhoud omgezet in BASE64 door uw applicatie en opgenomen in het multi-deelbericht met Content-Transfer-Encoding. Base64. Er zijn andere mechanismen om binaire gegevens over te dragen, maar dit is nogal gebruikelijk. Binaire gegevens worden omgezet in octetten en uitgeschakeld in arbitraire lengte strengen (afhankelijk van de coderende variant - zie bovenstaande BASE64 link). De ontvangende applicatie decodeert het dan in de oorspronkelijke binaire inhoud. Ik ben geen python programmeur, maar ik zou er verbaasd zijn dat je dit zelf zelf had moetencode. Ik vermoed dat er vooropgestelde python-bibliotheekfuncties zijn om dit voor u te doen. Antwoordde Mar 27 13 om 17:43 Bedankt, ik kijk naar een andere RFC die niet zo informatief was. Ik heb ook RFC 2046 gevonden die specifiek multi-part berichten in sectie 5 definieert. Let er op dat er een beetje subtiliteit is in deze RFC's, die via me uit: het zegt dat multipart berichten geen encodingen kunnen hebben, anders dan 7-bits, 8-bits en binair (Dat wil zeggen niet Base-64). Het gaat echter verder om te zeggen dat de afzonderlijke onderdelen binnen het multi-deel eigen inhoudscoderingen kunnen hebben, dus u bent correct dat Base-64 mogelijk is. Ndash brianmearns 28 maart 13 om 13:20 Uw antwoord 2017 Stapeluitwisseling, IncDescription void header (tekenreeks, bool vervangen true, int httpresponsecode) header () wordt gebruikt om een ??ruwe HTTP-header te verzenden. Raadpleeg de raquo HTTP1.1-specificatie voor meer informatie over HTTP-headers. Vergeet niet dat de koptekst () moet worden gebeld voordat er daadwerkelijke uitvoer wordt verzonden, hetzij door normale HTML-tags, lege lijnen in een bestand of van PHP. Het is een zeer voorkomende fout om code te lezen met include. Of nodig hebben. Functies of een andere toegangsfunctie voor bestanden, en hebben ruimtes of lege lijnen die worden uitgevoerd voordat de koptekst () wordt genoemd. Hetzelfde probleem bestaat wanneer u een enkel PHPHTML bestand gebruikt. Lthtmlgt ltphp Dit geeft een fout. Noteer de bovenstaande uitvoer, die voor de koptekst () oproephoofd staat (Locatie: voorbeeld) exit gt Parameters De koptekst. Er zijn twee hoofdletters met speciale hoofdletters. De eerste is een koptekst die begint met de HTTP-citaatreeks (het geval is niet significant), die gebruikt wordt om de HTTP-statuscode te verzenden die moet worden verzonden. Als u bijvoorbeeld Apache hebt geconfigureerd om een ??PHP-script te gebruiken om aanvragen voor ontbrekende bestanden te verwerken (met behulp van de ErrorDocument-richtlijn), kunt u ervoor zorgen dat uw script de juiste statuscode genereert. Ltphp header (HTTP1.0 404 Niet gevonden) gt Het tweede speciale geval is de quotLocation: quot header. Niet alleen stuurt deze koptekst naar de browser terug, maar geeft ook een REDIRECT (302) statuscode terug naar de browser, tenzij de 201 of een 3xx statuscode al is ingesteld. Ltphp header (Locatie: voorbeeld) Herleider browser Zorg ervoor dat onderstaande code niet wordt uitgevoerd wanneer we doorverwijzen. Exit gt De optionele vervangingsparameter geeft aan of de koptekst een vorige soortgelijke koptekst moet vervangen of een tweede koptekst van hetzelfde type toevoegen. Standaard zal het vervangen, maar als u FALSE als tweede argument doorgaat, kunt u meerdere kopjes van hetzelfde type dwingen. Bijvoorbeeld: koptekstkop van ltphp-koptekst (WWW-Authenticate: Negotiate) (WWW-Authenticate: NTLM. False) gt Maakt de HTTP-responscode op de opgegeven waarde. Merk op dat deze parameter alleen effect heeft als de string niet leeg is. Het is belangrijk om op te merken dat headers daadwerkelijk worden verzonden als de eerste byte naar de browser wordt uitgevoerd. Als u headers in uw scripts vervangt, betekent dit dat de plaatsing van echoprint statements en output buffers effectief kan beinvloeden welke headers worden verzonden. In het geval van doorsturen, kan u, als u uw script vergeten bent na het versturen van de koptekst, een buffer toevoegen of een teken verzenden, de pagina waarop uw gebruikers worden verzonden, wijzigen. Dit wordt doorgestuurd naar 2.html sinds de tweede koptekst de eerste vervangt. Ltphp header (locatie: 1.html) header (locatie: 2.html) vervangt 1.html gt Deze doorstuurt naar 1.html sinds de koptekst wordt verzonden zodra de echo gebeurt. U ziet ook dat kopers al fouten hebben verstuurd omdat de browser de omzetting volgt voordat het de fout kan tonen. Ltphp header (locatie: 1.html) echo verzend data header (locatie: 2.html) 1.html al verstuurd gt Het inpakken van het vorige voorbeeld in een uitvoerbuffer verandert eigenlijk het gedrag van het script Dit komt doordat headers arent verzonden worden naar de output Buffer wordt gespoeld. Ltphp obstart () header (locatie: 1.html) echo verzend data header (locatie: 2.html) vervangt 1.html obendflush () nu worden de headers verzonden gt Mijn bestanden zijn in een gecomprimeerde toestand (bz2). Wanneer de gebruiker op de link klikt, wil ik dat ze de ongecomprimeerde versie van het bestand krijgen. Na het decomprimeren van het bestand kwam ik in het probleem, dat het dialoogvenster altijd opkomt, zelfs als ik het dialoogvenster zei om deze operatie altijd met dit bestandstype uit te voeren. Zoals ik ontdekte, was het probleem in de header richtlijn Content-Disposition, namelijk de bijlage richtlijn. Als u wilt dat uw browser een gewone link naar een bestand simuleert, wijzigt u de bijlage inline of helpt u het geheel en gaat het goed. Dit heeft me even geduurd om erachter te komen en ik hoop dat het iemand anders daar zal helpen, die in hetzelfde probleem loopt. Php-bestand opslaan in ANSI zonder probleem, maar als u het bestand in UTF-8-formaat opslaat, moet u om verschillende redenen het bestand opslaan zonder BOM (byte-order mark) ondersteuning. Anders komt u in het probleem dat de headers niet goed worden verzonden, bijvoorbeeld. Ltphp-koptekst (Set-Cookie: naamgebruiker) gt Zulks iets als dit geven: - Waarschuwing: Kan geen koptekstinformatie wijzigen - kopteksten die al doorgestuurd zijn (output begonnen bij C: wwwinfo. php: 1) in C: wwwinfo. php op lijn 1 Naar de RFC 6226 (tools. ietf. orghtmlrfc6266), is de enige manier om Content-Disposition Header te verzenden met codering: Content-Disposition: bijlage bestandsnaam UTF-8e282ac20rates voor achteruit compatibiliteit, wat moet worden verzonden is: Content-Disposition: bijlage bestandsnaamEURO Tarieven filenameutf-8e282ac20rates Als gevolg hiervan zouden we de ltphp bestandsnaam. exe een bestandsnaam moeten gebruiken in Chinese karakters contentDispositionField Content-Disposition: attachment. Sprintf (bestandsnamen. Rawurlencode (bestandsnaam)). Sprintf (file nameutf-8s. Rawurlencode (bestandsnaam)) header (Content-Type: applicationoctet-stream) readfile (filetodownload. exe) gt Ik heb de code getest in IE6-10, Firefox en Chrome. Voor grote bestanden (100 MBs), vond ik dat het essentieel is om de bestandsinhoud ASAP te spoelen, anders verschijnt de downloaddialoog pas lang of nooit. Header (Content-Type: applicationforce-download) header (Content-Type: applicationoctet-stream) header (Content-Type: applicationdownload) header (Inhoudsopgave: Omschrijving: Bestandsnaam) Transfer) header (Content-Length:. File size (file)) flush () dit doet niet echt uit. Fp fopen (bestand. R) terwijl (feof (fp)) echo fread (fp. 65536) flush () dit is essentieel voor grote downloads fclose (fp) gt Als u niet gebruikt hebt, kan HTTP Response 204 zeer handig zijn. 204 vertelt de server om dit verzoek onmiddellijk te termiante. Dit is handig als u een javascript (of soortgelijke) client-side functie wilt uitvoeren om een ??server-side functie uit te voeren zonder de huidige webpagina te verversen of te wijzigen. Geweldig voor het bijwerken van de database, het instellen van globale variabelen, enz. Header (status: 204) (of de andere oproep) koptekst (HTTP1.0 204 Geen antwoord) Een oproep tot sessionwriteclose () voor de afsluiting ltphp header (Locatie: URL) ) Gt wordt aanbevolen als u zeker wilt dat de sessie is bijgewerkt voordat u doorgaat naar de omleiding. We hebben geconfronteerd met een situatie waarin het script dat door de omleiding werd geopend, de sessie niet correct laadde omdat het precedent script de tijd niet had om het te updaten (we gebruikten een database handler). Om u allemaal te informeren, word niet verward tussen Content-Transfer-Encoding en Content-Encoding Content-Transfer-Encoding specificeert de codering die gebruikt wordt om de gegevens in het HTTP-protocol over te brengen, zoals raw binary of base64. (Binair is compacter dan base64. Base64 heeft 33 overhead). Bv. Gebruik: - header (Content-Transfer-Encoding: binary) Content-Encoding wordt gebruikt om dingen zoals gzip-compressie aan de contentdata toe te passen. Bv. Gebruik: - header (Content-Encoding: gzip) U kunt HTTPs etags gebruiken en de laatst gewijzigde data gebruiken om ervoor te zorgen dat u de browsergegevens niet verstuurt die het al heeft gecached. Ltphp lastmodifiedtime filemtime (bestand) etag md5file (bestand) header (laatst gewijzigd:.gmdate (D, d MYH: i: s. Lastmodifiedtime). GMT) header (Etag: etag) als (strtotime (SERVER HTTPIFMODIFIEDSINCE) lastmodifiedtime trim SERVER HTTPIFNONEMATCH) etag) koptekst (HTTP1.1 304 Niet gewijzigd) exit gt Als u een koptekst wilt verwijderen en ervoor zorgt dat het niet wordt verzonden als onderdeel van het koptekst, geeft u niets als de koptekstwaarde na de koptekstnaam. Bijvoorbeeld. PHP geeft standaard altijd de volgende koptekst: Welke uw volledige koptekst zal eruit zien HTTP1.1 200 OK Server: Apache2.2.11 (Unix) X-Powered-Door: PHP5.2.8 Datum: Vri 16 Okt 2009 23: 05:07 GMT Content-Type: texthtml charsetUTF-8 Verbinding: sluiten Als u de koptekst noemt, zonder waarde zoals dit. Uw koptekst ziet er nu als volgt uit: HTTP1.1 200 OK Server: Apache2.2.11 (Unix) X-Powered-Door: PHP5.2.8 Datum: Vr 16 Okt 2009 23:05:07 GMT Verbinding: sluiten Ik wil gewoon toevoegen , Omdat ik hier veel verkeerde formatteerde kopteksten zie. 1. Alle gebruikte headers hebben eerste letters hoofdletters, dus je moet dit volgen. Bijvoorbeeld: Locatie, geen locatie Inhoudstype, niet inhoudstype, noch CONTENT-TYPE 2. Dan moet er colon en ruimte zijn, zoals goed: header (inhoudstype: tekstvlak) verkeerd: koptekst (inhoudstype: tekstvlak ) 3. Locatie header MOET absolute uri zijn met schema, domein, poort, pad, enz. 4. Relatieve URI's zijn NIET toegestaan ??verkeerd: Locatie: something. phpa1 fout: Locatie. A1 Het zal proxyserver en http-clients gelukkiger maken. Na veel onderzoek en testen, wil Id mijn bevindingen delen over mijn problemen met Internet Explorer en download van bestanden. Kijk eens naar deze code, die de normale download van een Javascript repliceert: ltphp als (strstr (SERVER HTTPUSERAGENT, MSIE) false) header (Content-type: textjavascript) header (Content-Disposition: inline filenamedownload. js) header - Lengte:.bestandgrootte (my-file. js)) header (inhoudstype: applicationforce-download) header (inhoud-dispositie: bijlage fileamedownload. js) header (inhoudslengte:.bestanden grootte (my-file. js) ) Koptekst (Expires: Vr, 01 Jan 2010 05:00:00 GMT) als (cache-Control: no-cache) header (Pragma: no-cache) als (my-cache van strstr (SERVER HTTPUSERAGENT, MSIE) File. js) gt Laten we nu uitleggen: ik begin met het controleren van IE, en indien niet IE, stel ik inhoudstype (hoofdlettergevoelig) in op JS en stel Content-Disposition in (elke koptekst is nu hoofdlettergevoelig ) Inline, omdat de meeste browsers buiten IE graag JS inline laten zien. (Gebruiker kan instellingen wijzigen). De koptekst inhoudslengte is vereist door sommige browsers om het downloadvak te activeren. Dan, als het IE is, is het content-type van het applicationforce-download soms nodig om het downloadvak weer te geven. Gebruik dit als u uw PDF niet wilt weergeven in de browser (in IE). Ik gebruik het hier om ervoor te zorgen dat de doos opent. Hoe dan ook, ik stel de inhoudsopgave in bijlage, omdat ik al weet dat het vak verschijnt. Dan heb ik weer de inhoudslengte. Nu, hier is mijn grote punt. Ik heb de Cache-Control en Pragma headers alleen verzonden indien niet IE. DEZE HOOFDERS ZIJN NIET ONDERZOEKEN OP IE. Gebruik alleen de koptekst Expires, het zal het bestand nogmaals de volgende keer opnieuw moeten downloaden. Dit is geen bug IE slaat downloads op in de map Tijdelijke internetbestanden totdat de download is voltooid. Ik weet dit omdat ik een groot bestand naar My Documents heb gedownload, maar het download dialoogvenster zet het in de map Temp en verhuist het aan het einde. Denk er gewoon over na. Als IE het bestand naar de Temp-map hoeft te downloaden, zal het instellen van de Cache-Control en Pragma-headers een fout veroorzaken. Ik hoop dat dit iemand wat tijd bespaart. Hier is een php script dat ik schreef om een ??bestand te streamen en te crypten met een xor-operatie Op de bytes en met een sleutel. De encryptie werkt erg goed, maar de snelheid neemt af met 2, het is nu 520KiBs. De gebruiker is nu gevraagd om een ??md5 wachtwoord (in plaats van direct in de code te houden). Er is een deel in het Frans omdat het mijn moedertaal zo wijzigt als u wilt. Ltphp Stream bestanden en encrypt de data op de vlucht Instellingen - Bestand om bestanden te streamen - Uitlezen buffer bufferlengte 3840 - Invoegen hex keychar 9cdfb439c7876e703e307864c9167a15 Functie: Omzetting hex sleutel in een tekenreeks in binaire functie hex2bin (h) als (H) a) ta hexdec (h 2 a) tb hexdec (h (2 a 1)) ra (int) ((ta) Ltlt 4) tb) retourfunctie Functie om de authooffunctie te versturen askPassword (tekst Voer het wachtwoord in) koptekst (WWW-Authenticate: Basis rijk. Utf8decode (tekst).) Koptekst (HTTP1.0 401 Ongemachtigd) retourneren 1 Sleutel wordt gevraagd bij De eerste start als (isset (SERVER PHPAUTHPW)) askPassword () echo Une cl est ncessaire ltbr gt exit Haal de sleutel in hex keychar SERVER PHPAUTHPW Convert toets en stel de grootte van de sleutel toets hex2bin (keychar) keylength count (toets) Teste Si la cl est valide en hex als (sleutel keylength lt 4) askPassword (Cl incorrecte) Echo Cl Incorrecte Licht Uitgang () Teste si la cl est de longueur dune puissance de 2 als ((keylength 2) 0) askPassword (Cl de longueur incorrecte (meerdere de 2 uniquement)) echo Cl de longueur incorrecte (puissance de 2 uniquement ) Ltbr gt exit () Koptekstkop (Content-Type: applicationoctet-stream) koptekst (Content-Transfer-Encoding: binary) koptekst (Inhoudsduur:. Bestandsgrootte (bestand). ) Header (bestandsnaam. Bestand.) Flush () dit maakt niet echt uit. Open het bestand in alleen-lezen fp fopen (bestand. R) terwijl (feof (fp)) Lees een buffergrootte van de file buffer fread (fp. Bufferlength) j 0 voor (i 0 i lt bufferlengte i) De sleutel wordt gelezen In lus om het hele bestand te crypten als (i keylength 0) j 0 Een xor-operatie tussen de sleutel en het bestand gebruiken om te crypten. Deze operatie eet veel CPU-tijd (Stream op 1MiBs op mijn server Intel E2180) tmp pack (C. Sleutel j) bufferE (buffer i tmp) lt Le fameux XOR Stuur de encrypted data echo bufferE Maak de geheugenbufferEJ buffer flush () dit is essentieel voor grote downloads fclose (fp) exit () Sluit het bestand en het afgeronde fclose (fp ) VERWIJDEREN ZEER BYTE ORDER MARKEN Koptekst MOET ALLEEN op de pagina worden verzonden. Zelfs een enkele ruimte zal je script breken. In mijn geval was er BOM in de codering geplaatst, zodat ik het bestand met notitieblok opende en de codering op UTF-8 (geen BOM) en voila zetten, alles werkt nu goed. Ik heb lange tijd geprobeerd te bepalen waarom Internet Explorer 7 de gebruiker niet heeft gevraagd om een ??download op te slaan op basis van de bestandsnaam die is opgegeven op een Content-Disposition: attachment bestandsnaam. Koptekst. Ik heb uiteindelijk vastgesteld dat mijn Apache-installatie een extra koptekst toevoegde: Vary: Host, die IE gooide - zoals per support. microsoftkb824847 heb ik handmatig de Vary-koptekst van PHP gevonden als volgt header (Vary: User-Agent) IE toegestaan ??om Gedragen zoals bedoeld. Hoop dit bespaart iemand anders enige tijd. De codering van een bestand wordt ontdekt door het Content-Type, ofwel in de HTML-metatag of als onderdeel van de HTTP-koptekst. Zo heeft de server en de browser niet nodig - of verwacht - een Unicode-bestand om te beginnen met een BOM-markering. BOM's kunnen ook nix-systemen verwarren. Meer informatie bij unicode. orgfaqutfbom. htmlbom1 Op een andere noot: Safari kan CMYK-afbeeldingen weergeven (tenminste de OS X-versie, omdat het gebruik maakt van de services van QuickTime). Een locatiekop heet geeft een REDIRECT (302) statuscode aan de browser, tenzij de 201 of een 3xx statuscode is al ingesteld. Als u een reactie stuurt op een POST-aanvraag, wilt u misschien naar RFC 2616 secties 10.3.3 en 10.3.4. Het is aan te bevelen dat als u de browser onmiddellijk wilt halen in de locatie header in deze omstandigheid, moet u een 303 statuscode gebruiken, niet de 302 (met dezelfde link als hypertekst in het lichaam voor zeer oude browsers). Dit kan (zeldzame) gevolgen hebben als vermeld in bug 42969.