Saturday, 11 November 2017

Content disposition fäste binära alternativ


Senast uppdaterad: 12 feb 2013 Content-Disposition header - tvinga SaveAs i webbläsare Det finns situationer (för att spara en dokumentation i pdf-format eller ett finansiellt dokument) där du kanske vill ha en hyperlänk som leder till en fil för att presentera en SaveAs-dialogruta i webbläsaren. Sätt att göra det finns. Flakigt webbläsarstöd gör dock användningen en promenad i gruvfältet. Tvinga SaveAs med javascript i Internet Explorer Med javascript kan du skapa en dialogruta för att spara sidan som visas för närvarande (om användaren tittar på Internet Explorer på din sida som är). Detta görs genom följande kod: Spara den här pageln Men vanligtvis vill du spara en annan fil, den fil som en hyperlänk leder till. För att göra det är javascript inte tillräckligt (åtminstone det finns inget sådant standard sätt) och något måste göras på servern. Tvinga SaveAs med HTTP-huvudet För att tvinga webbläsaren att visa SaveAs-dialogrutan när du klickar på en hyperlänk måste du inkludera följande rubrik i HTTP-svaret på filen som ska hämtas: Content-Disposition: attachment filenameltfile name. extgt Var ltfile name. extgt är filnamnet du vill se i SaveAs-dialogrutan (som finances. xls eller mortgage. pdf) - utan lt and gt-symboler. Du måste ha följande i åtanke: Filnamnet ska vara i US-ASCII-charset och ska inte innehålla specialtecken: lt gt. . rymden. Filnamnet ska inte ha någon angiven katalogvägsinformation. Filnamnet ska bifogas i dubbla citat men de flesta webbläsare stöder filnamn utan dubbla citat. Forntida webbläsare krävde också följande (behövs inte idag, men för en dumt bevislösning kan det vara värt att göra): Content-Type header bör vara före Content-Disposition. Innehållsrubrikrubrik ska referera till en okänd MIME-typ (åtminstone tills de äldre webbläsarna går bort). Detaljerad användning howto Content-disposition stöd i Internet Explorer Det verkar som att Internet Explorer har den värsta spårningen av Content-Disposition header support. Funktionen hade många säkerhetsproblem och som ett resultat Microsoft ändrade koden många gånger ibland helt och hållet bryta den. Övning har visat att nedladdningskoden använder en annan HTTP-huvudparser. Och om den parsern inte lyckas med hanteringen av alla rubriklinjer, kommer IE inte att ladda ner filen alls. Internet Explorer 9.0 Beroende på WinInet. dll-versionen kan det hända att filen inte laddas ned med filnamnet som innehåller följande specialtecken: lt gt. . rymden. Microsoft Knowledgebase-artiklar: 949197 Skapa ett bifogat innehålls-dispositionsrubrikvärde med det angivna filnamnet, om det tillhandahålls. Filnamnet är valfritt och om inget filnamn är önskat, men du vill ange alternativ. Ange filnamn till odefinierad. notera HTTP-rubriker är av ISO-8859-1 teckenuppsättningen. Om du skriver denna rubrik via ett sätt som skiljer sig från setHeader i Node. js, vill du ange binär kodning i Node. js. contentDisposition accepterar dessa egenskaper i alternativobjektet. Om filnamnalternativet ligger utanför ISO-8859-1 lagras filnamnet faktiskt i ett tilläggsfält för klienter som stöder Unicode-filnamn och en ISO-8859-1-version av filnamnet genereras automatiskt. Detta anger ISO-8859-1-filnamnet för att åsidosätta den automatiska generationen eller inaktiverar generationen ihop, som standard till sant. En sträng anger ISO-8859-1-filnamnet som ska användas i stället för automatisk generation. false kommer att inaktivera med ett ISO-8859-1 filnamn och inkluderar endast Unicode-versionen (om inte filnamnet redan är ISO-8859-1). sann kommer att möjliggöra automatisk generation om filnamnet ligger utanför ISO-8859-1. Om filnamnet alternativet är ISO-8859-1 och det här alternativet är angivet och har ett annat värde, är filnamnet alternativet kodat i det utökade fältet och det här stället som återgångsfält, trots att de båda är ISO-8859-1. Anger dispositionstypen, standard för bilaga. Detta kan också vara inline. eller något annat värde (alla värden utom inline behandlas som bilaga. men kan vidarebefordra ytterligare information om båda parter är överens om det). Typen normaliseras till små bokstäver. Parsa en rubrik för innehållshantering. Detta hanterar automatiskt utvidgade parametrar (Unicode) genom att avkoda dem och ge dem under standardparameterns namn. Detta kommer att returnera ett objekt med följande egenskaper (exempel visas för strängfiler filnamnEURO rates. txt filnamnUTF-8e282ac20rates. txt): typ. Anläggningstyp (alltid små bokstäver). Exempel: bilaga parametrar. Ett syfte med parametrarna i dispositionen (namn på parameter alltid små bokstäver och förlängda versioner ersätter icke-utvidgade versioner). Exempel: Skicka en fil för downloadDescription void header (strängsträng, bool ersätt true, int httpresponsecode) header () används för att skicka en rå HTTP-rubrik. Se raquo HTTP1.1-specifikationen för mer information om HTTP-rubriker. Kom ihåg att huvudet () måste ringas innan någon faktisk utmatning skickas, antingen med vanliga HTML-taggar, tomma rader i en fil eller från PHP. Det är ett mycket vanligt fel att läsa kod med inkludera. eller kräva. funktioner eller annan filåtkomstfunktion och har mellanslag eller tomma rader som matas ut före rubrik () kallas. Samma problem finns när du använder en enda PHPHTML-fil. lthtmlgt ltphp Detta kommer att ge ett fel. Observera utmatningen ovan, som ligger före huvudrubriken () samtalsrubrik (Plats: exempel), avsluta gt Parametrar Huvudsträngen. Det finns två samtal med speciella fall. Den första är en rubrik som börjar med strängkvot HTTP-kvot (fallet är inte signifikant), vilket kommer att användas för att räkna ut HTTP-statuskoden som ska skickas. Om du till exempel har konfigurerat Apache för att använda ett PHP-skript för att hantera förfrågningar om saknade filer (med hjälp av ErrorDocument-direktivet), kanske du vill se till att ditt skript genererar rätt statuskod. ltphp header (HTTP1.0 404 Ej hittad) gt Det andra specialfallet är quotLocation: quot header. Det skickar inte bara den här rubriken tillbaka till webbläsaren, men den returnerar även en REDIRECT (302) statuskod till webbläsaren, om inte 201 eller 3xx-statuskoden redan har ställts in. ltphp-rubrik (Plats: exempel) Omdirigera webbläsare Kontrollera att koden nedan inte körs när vi omdirigerar. exit gt Den alternativa ersättningsparametern anger om rubriken ska ersätta en tidigare liknande rubrik eller lägga till en andra rubrik av samma typ. Som standard kommer den att ersätta, men om du skickar in FALSE som det andra argumentet kan du tvinga flera rubriker av samma typ. Till exempel: ltphp header (WWW-Authenticate: Negotiate) header (WWW-Authenticate: NTLM. False) gt Kräver HTTP-svarskoden till det angivna värdet. Observera att den här parametern endast har en effekt om strängen inte är tom. Det är viktigt att notera att rubriker faktiskt skickas när den första byten matas ut till webbläsaren. Om du ersätter rubriker i dina skript betyder det att placeringen av echoprint-satser och utmatningsbuffertar faktiskt kan påverka vilka rubriker som skickas. Vid omdirigeringar kan om du glömmer att avsluta ditt skript efter att ha skickat rubriken, kan du lägga till en buffert eller skicka ett tecken och ändra vilken sida dina användare skickas till. Detta omdirigeras till 2.html eftersom den andra rubriken ersätter den första. ltphp header (plats: 1.html) header (plats: 2.html) ersätter 1.html gt Detta omdirigeras till 1.html eftersom rubriken skickas så snart ekot händer. Du ser inte heller några rubriker som redan skickat fel eftersom webbläsaren följer omdirigeringen innan den kan visa felet. ltphp header (location: 1.html) echo send datahuvud (plats: 2.html) 1.html redan skickat gt Ompakning av föregående exempel i en utmatningsbuffert ändrar faktiskt skriptets beteende Detta beror på att rubrikerna skickas till utgången buffert spolas. ltphp obstart () header (plats: 1.html) echo send data header (plats: 2.html) ersätter 1.html obendflush () nu rubrikerna skickas gt Mina filer är i komprimerat tillstånd (bz2). När användaren klickar på länken vill jag att de ska få den okomprimerade versionen av filen. Efter att ha dekomprimerat filen gick jag in i problemet, att nedladdningsdialogrutan alltid skulle dyka upp, även när jag berättade för dialogrutan att alltid utföra denna operation med den här filtypen. Som jag fick reda på var problemet i toppdirektivet Content-Disposition, nämligen bilagan. Om du vill att din webbläsare ska simulera en vanlig länk till en fil, antingen ändra bilagan till inline eller släppa den helt och hållet och du kommer att bli bra. Det tog mig ett tag att räkna ut och jag hoppas att det kommer att hjälpa någon annan där ute, som löper in i samma problem. Spara php-filen i ANSI utan problem, men när du sparar filen i UTF-8-format av olika anledningar, kom ihåg att spara filen utan något BOM-stöd (byte-order mark). Annars kommer du att få problem med att rubrikerna inte skickas korrekt, t. ex. ltphp header (Set-Cookie: nameuser) gt Skulle ge något så här: - Varning: Kan inte ändra huvudinformation - rubriker som redan skickats av (utgången startade vid C: wwwinfo. php: 1) i C: wwwinfo. php på rad 1 Enligt till RFC 6226 (tools. ietf. orghtmlrfc6266) är det enda sättet att skicka Content-Disposition Header med kodning: Content-Disposition: bilaga filnamn UTF-8e282ac20rates för bakåtkompatibilitet, det som ska skickas är: Content-Disposition: attachment filnamnEURO priser filenameutf-8e282ac20rates Som ett resultat bör vi använda ltphp filnamn. exe ett filnamn i kinesiska tecken contentDispositionField Content-Disposition: attachment. sprintf (filnamn. rawurlencode (filnamn)). sprintf (filenameutf-8s. rawurlencode (filnamn)) header (Content-Type: applicationoctet-stream) readfile (filetodownload. exe) gt Jag har testat koden i IE6-10, Firefox och Chrome. För stora filer (100 MB) fann jag att det är viktigt att spola filinnehållet ASAP, annars visas inte dialogrutan för nedladdning för länge eller aldrig. header (Content-Type: applicationoctet-stream) header (Content-Type: applicationdownload) header (innehålls-beskrivning: filnamn) Överföring) header (Content-Length:. File size (file)) flush () det spelar ingen roll om. fp fopen (fil. r) medan (feof (fp)) echo fread (fp. 65536) flush () Detta är viktigt för stora nedladdningar fclose (fp) gt Om du inte har använt kan HTTP Response 204 vara mycket bekvämt. 204 berättar servern att omedelbart säga upp denna begäran. Det här är till hjälp om du vill ha en javascript (eller liknande) klientsidfunktion för att utföra en server-sida-funktion utan att uppdatera eller ändra den aktuella webbsidan. Perfekt för att uppdatera databasen, ställa in globala variabler, etc. header (status: 204) (eller det andra samtalet) header (HTTP1.0 204 Inget svar) Ett samtal till sessionwriteclose () innan uttalandet ltphp header (Plats: URL) ) gt rekommenderas om du vill vara säker på att sessionen uppdateras innan du går vidare till omdirigeringen. Vi stötte på en situation där manuset åtkomst av omdirigeringen inte laddade sessionen korrekt, eftersom det inte var dags att uppdatera det föregående manuskriptet (vi använde en databashanterare). Bara för att informera er alla, bli inte förvirrad mellan Content-Transfer-Encoding och Content-Encoding Content-Transfer-Encoding anger den kodning som används för att överföra data i HTTP-protokollet, till exempel rå binär eller base64. (binär är mer kompakt än base64. bas64 har 33 överhead). Till exempel Använd: - header (Content-Transfer-Encoding: binär) Content-Encoding används för att applicera saker som gzip-komprimering till innehållsdata. T. ex. Använd: - rubrik (Content-Encoding: gzip) Du kan använda HTTPs etags och senast ändrade datum för att säkerställa att du inte skickar webbläsardata som den redan har cachat. ltphp lastmodifiedtime filemtime (fil) etag md5file (fil) header (Senast ändrad:.gmdate (D, d MYH: i: s. lastmodifiedtime). GMT) header (Etag: etag) om (strtotime (SERVER HTTPIFMODIFIEDSINCE) lastmodifiedtime trim SERVER HTTPIFNONEMATCH) etag) header (HTTP1.1 304 Not Modified) exit gt Om du vill ta bort en rubrik och behålla den från att skickas som en del av rubrikens svar, ge bara inget som rubrikvärdet efter rubriknamnet. Till exempel. PHP returnerar som standard alltid följande rubrik: Vilket ditt hela rubrik svar ser ut som HTTP1.1 200 OK Server: Apache2.2.11 (Unix) X-Powered-Av: PHP5.2.8 Datum: Fre, 16 Oct 2009 23: 05:07 GMT Innehållstyp: texthtml charsetUTF-8 Anslutning: Stäng Om du anropar rubriknamnet med inget värde så. Dina rubriker ser nu så här ut: HTTP1.1 200 OK Server: Apache2.2.11 (Unix) X-Powered-Av: PHP5.2.8 Datum: Fre, 16 Oct 2009 23:05:07 GMT Anslutning: Stäng Jag vill bara lägga till , eftersom jag ser här många felformade rubriker. 1. Alla använda rubriker har första bokstäver stora versioner, så du måste följa detta. Till exempel: Plats, inte plats Innehålls-typ, inte innehållstyp eller INNEHÅLL-TYP 2. Då måste MÅSTE vara kolon och mellanslag, som bra: rubrik (Innehållstyp: textplain) fel: rubrik (Innehållstyp: textplain ) 3. Platsrubrik MÅSTE vara absolut uri med schema, domän, port, sökväg, etc. 4. Relativa URI är INTE tillåtet fel: Plats: something. phpa1 fel: Plats. a1 Det kommer att göra proxyservern och http-klienter lyckligare. Efter mycket forskning och test tycker jag att jag delar mina resultat om mina problem med Internet Explorer och nedladdningar av filer. Ta en titt på den här koden, som replikerar den vanliga nedladdningen av Javascript: ltphp if (header (SERVER HTTPUSERAGENT, MSIE) false) header (Content-type: textjavascript) header (Content-Disposition: inline filenamedownload. js) header - Längd:.filstorlek (my-file. js)) annan rubrik (innehållstyp: applicationforce-download) header (Content-Disposition: attachment filenamedownload. js) header (Content-Length:.fileize (my-file. js) ) header (Utgår: fre, 01 jan 2010 05:00:00 GMT) om (header (SERVER HTTPUSERAGENT, MSIE) false) header (Cache-Control: no-cache) header (Pragma: no-cache) file. js) gt Låt mig nu förklara: Jag börjar med att leta efter IE, om inte IE, sätter jag Innehållstyp (skiftlägeskänslig) till JS och anger Content-Disposition (varje rubrik är skiftlägeskänslig från och med nu ) att inline, eftersom de flesta webbläsare utanför IE gillar att visa JS inline. (Användaren kan ändra inställningar). Innehållslängdsrubriken krävs av vissa webbläsare för att aktivera nedladdningsrutan. Då, om det är IE, behövs ibland nedladdningsfältet Application Force-Download Content-typ. Använd detta om du inte vill att din PDF ska visas i webbläsaren (i IE). Jag använder den här för att försäkra dig om att rutan öppnas. Hur som helst, jag ställer in innehållsförteckningen i bilagan eftersom jag redan vet att rutan kommer att visas. Sedan har jag innehållslängden igen. Nu är det min stora poäng. Jag har Cache-Control och Pragma headers skickas endast om inte IE. Dessa headers kommer att förhindra nedladdning på IE. Använd endast Expires-rubriken, trots allt kommer det att kräva att filen hämtas igen nästa gång. Detta är inte ett fel IE lagrar nedladdningar i mappen Tillfälliga Internetfiler tills nedladdningen är klar. Jag vet det för att när jag hämtade en stor fil till Mina dokument, men hämtningsdialogrutan lade den i Temp-mappen och flyttade den i slutet. Tänk på det. Om IE kräver att filen hämtas till Temp-mappen, kommer inställningen av Cache-Control och Pragma-rubrikerna att orsaka ett fel. Jag hoppas det sparar någon tid. Här är ett php-script som jag skrev för att strömma en fil och krypta den med en xor-operation på byte och med en nyckel. Krypteringen fungerar väldigt bra men hastigheten minskar med 2, det är nu 520KiBs. Användaren är nu uppmanad till ett md5-lösenord (istället för att hålla det i koden direkt). Det finns en del på franska eftersom det är mitt modersmål så modifiera det som du vill. ltphp Streama filer och kryptera data på flygelinställningar - Fil för att strömma fil FILEout - Läs buffertbuffertlängd 3840 - Skriv in hex keychar 9cdfb439c7876e703e307864c9167a15 Funktion: Konvertera hex-tangenten i en sträng till binär funktion hex2bin (h) om (h) a) ta hexdec (h 2 a) tb hexdec (h (2 a 1)) ra (int) ((ta) ltlt 4) tb) return r Funktion för att skicka auth headers-funktionen askPassword (text Skriv in lösenordet) header (WWW-Authenticate: Basic realm. utf8decode (text).) header (HTTP1.0 401 Ej auktoriserad) retur 1 Tangent uppmanas den första start om (isset (SERVER PHPAUTHPW)) askPassword () echo Une cl est nessaire ltbr gt exit Hämta nyckeln i hex keychar SERVER PHPAUTHPW Konvertera nyckeln och ställ in storleken på nyckelnyckeln hex2bin (keychar) keylength count (tangent) Teste si la cl est valide en hex om (nyckelnyckeln lt 4) askPassword (Cl incorrecte) echo Cl incorrecte ltbr gt exit () Teste si la cl est de longueur dune puissance de 2 om ((keylength 2) 0) askPassword (Cl de longueur incorrecte (flera de 2 uniquement)) echo Cl den longueur incorrecte (puissance de 2 uniquement ) ltbr gt exit () Headers header (Content-Type: applicationoctet-stream) header (Content-Transfer-Encoding: binär) header (Innehållslängd:. filformat (fil). ) header (filnamn. fil.) flush () det spelar ingen roll om. Öppnar filen i skrivskyddad fp fopen (fil. R) medan (feof (fp)) Läs en buffertstorlek för filbuffertfrakten (fp. Buffertlängd) j 0 för (i 0 I lt-buffertlängden i) Nyckeln läses i loop för att krypta hela filen om (jag keylength 0) j 0 Använd en xor-operation mellan tangenten och filen för att krypta Denna operation äter mycket CPU-tid (Ström på 1MiB på min server Intel E2180) tmp pack (C. nyckel j) buffertE (buffert i tmp) lt Le fameux XOR Skicka krypterad data echo buffertE Rengör minnesbuffertEj buffertflöde () Detta är nödvändigt för stora nedladdningar fclose (fp) exit () Stäng filen och dess färdiga fclose (fp ) UNDVIKA NOLL BYTE ORDER MARK HEAD MÅSTE skickas före ALLA på sidan. Även ett enda utrymme kommer att bryta ditt skript. I mitt fall var BOM inställd i kodningen, så jag öppnade filen med anteckningsblock och ställde in kodningen till UTF-8 (ingen BOM) och voila, allt fungerar bra nu. Jag har länge försökt bestämma varför Internet Explorer 7 inte berod användaren att spara en nedladdning baserat på filnamnet specificerat på ett innehålls-disposition: bifogat filnamn. rubrikrad. Jag bestämde mig så småningom för att min Apache-installation skulle lägga till ett tilläggsrubrik: Varav: Host, som kastade IE - enligt support. microsoftkb824847 Jag hittade manuellt att ställa in Vary-rubriken från PHP enligt följande header (Vary: User-Agent) tillät IE att uppför sig som avsedd Hoppas det här sparar någon annan någon gång. Kodningen av en fil upptäcks av innehållstypen, antingen i HTML-metakoden eller som en del av HTTP-rubriken. Sålunda behöver servern och webbläsaren inte - eller förvänta sig - en Unicode-fil som börjar med ett BOM-märke. BOM kan också förvirra nix-system. Mer information på unicode. orgfaqutfbom. htmlbom1 I en annan anteckning: Safari kan visa CMYK-bilder (åtminstone OS X-versionen, eftersom den använder QuickTime-tjänster). Ange en positionsrubrik returnerar en REDIRECT (302) statuskod till webbläsaren, om inte 201 eller 3xx statuskod har redan ställts in. Om du skickar ett svar till en POST-förfrågan kanske du vill titta på RFC 2616 avsnitt 10.3.3 och 10.3.4. Det rekommenderas att om du vill att webbläsaren direkt ska få resursen i platshuvudet under dessa omständigheter, ska du använda 303-statuskoden inte 302 (med samma länk som hypertext i kroppen för mycket gamla webbläsare). Detta kan ha (sällsynta) konsekvenser som nämns i bug 42969. Skapa ett bifogat innehålls-dispositionsrubrikvärde med det angivna filnamnet, om det tillhandahålls. Filnamnet är valfritt och om inget filnamn är önskat, men du vill ange alternativ. Ange filnamn till odefinierad. notera HTTP-rubriker är av ISO-8859-1 teckenuppsättningen. Om du skriver denna rubrik via ett sätt som skiljer sig från setHeader i Node. js, vill du ange binär kodning i Node. js. contentDisposition accepterar dessa egenskaper i alternativobjektet. Om filnamnalternativet ligger utanför ISO-8859-1 lagras filnamnet faktiskt i ett tilläggsfält för klienter som stöder Unicode-filnamn och en ISO-8859-1-version av filnamnet genereras automatiskt. Detta anger ISO-8859-1-filnamnet för att åsidosätta den automatiska generationen eller inaktiverar generationen ihop, som standard till sant. En sträng anger ISO-8859-1-filnamnet som ska användas i stället för automatisk generation. false kommer att inaktivera med ett ISO-8859-1 filnamn och inkluderar endast Unicode-versionen (om inte filnamnet redan är ISO-8859-1). sann kommer att möjliggöra automatisk generation om filnamnet ligger utanför ISO-8859-1. Om filnamnet alternativet är ISO-8859-1 och det här alternativet är angivet och har ett annat värde, är filnamnet alternativet kodat i det utökade fältet och det här stället som återgångsfält, trots att de båda är ISO-8859-1. Anger dispositionstypen, som standard till quotattachmentquot. Detta kan också vara quotinlinequot. eller något annat värde (alla värden utom inline behandlas som bilaga. men kan vidarebefordra ytterligare information om båda parter är överens om det). Typen normaliseras till små bokstäver. Parsa en rubrik för innehållshantering. Detta hanterar automatiskt utökade parametrar (quotUnicodequot) genom att avkoda dem och ge dem under standardparameterns namn. Detta returnerar ett objekt med följande egenskaper (exempel visas för strängfiler filenamequotEURO rates. txtquot filnamnUTF-8e282ac20rates. txt): typ. Anläggningstyp (alltid små bokstäver). Exempel: bilaga parametrar. Ett syfte med parametrarna i dispositionen (namn på parameter alltid små bokstäver och förlängda versioner ersätter icke-utvidgade versioner). Exempel: Skicka en fil för nedladdning

No comments:

Post a Comment