Content disposition attachment binary opties




Content disposition attachment binary optiesLaatst bijgewerkt: 12 feb 2013 Content-disposition header - dwingen SaveAs in browsers Er zijn situaties (om een ??documentatie in pdf-formaat of een financieel document op te slaan) waar u een hyperlink naar een bestand wilt hebben om een ??SaveAs-dialoog in browser te presenteren. Manieren om dat te doen bestaan. Echter, flaky browser ondersteuning maakt zijn gebruik een wandeling in het mijnveld. Force Saves gebruiken met javascript in Internet Explorer Met behulp van javascript kunt u een dialoog maken om de pagina te bewaren die momenteel wordt weergegeven (als de gebruiker via Internet Explorer op uw pagina kijkt). Dit wordt gedaan via de volgende code: Sla deze pagelta op. U wilt echter gewoon een ander bestand opslaan, het bestand waaraan een hyperlink leidt. Om dat te doen is javascript niet genoeg (er is in ieder geval geen standaard manier) en er moet iets op de server gebeuren. ForceAs dwingen met behulp van de HTTP-koptekst Om de browser te dwingen om SaveAs-dialoog te tonen wanneer u op een hyperlink klikt, moet u de volgende koptekst in HTTP-reactie van het bestand dat u wilt downloaden, bevatten: Content-Disposition: bijlage fileameltfile name. extgt Waar ltfile naam. Extgt is de bestandsnaam die u wilt zien in SaveAs dialoogvenster (zoals finances. xls of mortgage. pdf) - zonder lt en gt symbolen. U moet het volgende in gedachten houden: De bestandsnaam moet in de US-ASCII-charset zijn en mag geen speciale tekens bevatten: lt gt. . ruimte. De bestandsnaam mag geen opgegeven padinformatie bevatten. De bestandsnaam moet in dubbele citaten worden ingesloten, maar de meeste browsers ondersteunen bestandsnamen zonder dubbele aanhalingstekens. Oude browsers vereisen ook het volgende (niet nodig tegenwoordig, maar voor een dwaasbeveiligde oplossing zou het de moeite waard zijn): Content-Type header moet voor Content-Disposition zijn. Content-Type header moet verwijzen naar een onbekend MIME type (tenminste tot de oudere browsers weg gaan). Gedetailleerd gebruik howto Content-disposition ondersteuning in Internet Explorer Het lijkt erop dat Internet Explorer het slechtste track record heeft van de Content-Disposition header support. De functie had veel beveiligingsproblemen en als gevolg daarvan veranderde Microsoft de code vele malen en breek het soms helemaal. Praktijk heeft aangetoond dat de downloadcode een andere HTTP-headerparser gebruikt. En als die parser niet succesvol is om alle headerlijnen te verwerken, zal IE het bestand helemaal niet downloaden. Internet Explorer 9.0 Afhankelijk van de WinInet. dll versie kan het bestand niet worden gelukt met de bestandsnaam die de volgende speciale tekens bevat: lt gt. . ruimte. Microsoft Knowledge Base-artikelen: 949197Bouw een bijlage Content-Disposition header value met behulp van de gegeven bestandsnaam, indien aanwezig. De bestandsnaam is optioneel en als er geen bestandsnaam gewenst is, maar u wilt opties opgeven. Stel de bestandsnaam in ondefinieerd. Notitie HTTP-headers zijn van de ISO-8859-1-tekenset. Als u deze koptekst op een andere manier dan setHeader in Node. js schrijft, wil u de binaire codering in Node. js opgeven. ContentDisposition accepteert deze eigenschappen in het opties object. Als de bestandsnaam optie buiten ISO-8859-1 is, wordt de bestandsnaam in een aanvullend veld opgeslagen voor clients die Unicode-bestandsnamen ondersteunen en wordt een ISO-8859-1-versie van de bestandsnaam automatisch gegenereerd. Hiermee wordt de ISO-8859-1-bestandsnaam opgegeven om de automatische generatie te overschrijven of de generatie geheel uit te schakelen, standaard als waar. Een tekenreeks specificeert de ISO-8859-1-bestandsnaam om te gebruiken in plaats van automatische generatie. False zal uitschakelen met inbegrip van een ISO-8859-1-bestandsnaam en alleen de Unicode-versie (tenzij de bestandsnaam al ISO-8859-1 is). True zal automatische generatie inschakelen als de bestandsnaam buiten ISO-8859-1 ligt. Als de bestandsnaam optie ISO-8859-1 is en deze optie is opgegeven en een andere waarde heeft, dan wordt de bestandsnaamoptie gecodeerd in het uitgebreide veld en dit wordt ingesteld als het terugvalveld, al zijn deze beide ISO-8859-1. Specificeert het dispositietype, standaardinstellingen. Dit kan ook inline zijn. Of elke andere waarde (alle waarden behalve inline worden behandeld als bijlage. Maar kunnen extra informatie overbrengen indien beide partijen ermee akkoord gaan). Het type is genormaliseerd naar kleine letters. Parseer een inhoudsopgave koptekst. Dit verwerkt automatisch verlengde (Unicode) parameters door ze te decoderen en ze te geven onder de standaard parameternaam. Dit zal een object met de volgende eigenschappen retourneren (voorbeelden worden getoond voor de tekenreeksbestandnaamEURO rates. txt bestandsnaamUTF-8e282ac20rates. txt): type. Het type dispositie (altijd kleine letters). Voorbeeld: bijlage parameters. Een voorwerp van de parameters in de dispositie (naam van de parameter altijd kleine letters en uitgebreide versies vervangen niet-uitgebreide versies). Voorbeeld: Stuur een bestand voor downloadDescription void header (string string, bool vervang 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.