Monday 14 August 2017

Content Transfer Encoding Binario Options


La gestione dei dati binario con Axis2 (MTOMSwA) Introduzione Nonostante la flessibilità, interoperabilità, e l'accettazione globale di XML, ci sono momenti in cui la serializzazione dei dati in XML non ha senso. utenti dei servizi Web potrebbero voler trasmettere allegati binari di vario tipo come immagini, disegni, documenti XML, ecc insieme a un messaggio SOAP. Tali dati sono spesso in un particolare formato binario. Tradizionalmente, due tecniche sono state utilizzate nel trattamento dei dati opachi in XML Invio dati binari valore è ottenuto inserendo opaco dati (naturalmente dopo qualche forma di codifica) come elemento o attributo contenuto del componente XML dei dati. Il vantaggio principale di questa tecnica è che dà applicazioni la capacità di elaborare e descrivere i dati, basati esclusivamente sulla componente XML dei dati. XML supporta opaco dati come contenuti attraverso l'uso di uno o Base64 codifica del testo esadecimale. Entrambe le tecniche gonfiare la dimensione dei dati. Per UTF-8 codifica di testo sottostante, codifica base64 aumenta la dimensione dei dati binari di un fattore 1.33x delle dimensioni originali, mentre codifica esadecimale espande i dati di un fattore 2x. I fattori di cui sopra saranno raddoppiati se si utilizza la codifica del testo UTF-16. Anche di preoccupazione è l'overhead dei costi di lavorazione (reali o percepite) per questi formati, soprattutto quando la decodifica di nuovo in binario non elaborato. L'invio di dati binari di riferimento è ottenuta collegando dati binari puri come entità non analizzate generali esterne al di fuori del documento XML e quindi l'incorporamento URI di riferimento per quelle entità come elementi o valori degli attributi. Ciò impedisce il gonfiore inutili di dati e spreco di potenza di elaborazione. L'ostacolo principale per l'utilizzo di queste entità non analizzate è il loro forte dipendenza DTD, che impedisce la modularità, così come l'uso di namespace XML. Ci sono state diverse specifiche introdotte nel mondo dei servizi Web per affrontare questo problema allegato binario utilizzando la tecnica referencequot quotby. SOAP con allegati è un esempio. Dal momento che SOAP vieta dichiarazioni DTD (Document Type) nei messaggi, questo porta al problema della non rappresentazione dei dati come parte del infoset messaggio, quindi la creazione di due modelli di dati. Questo scenario è come l'invio di allegati con un messaggio di posta elettronica. Anche se tali allegati sono correlate al contenuto del messaggio non sono all'interno del messaggio. Questo fa sì che le tecnologie che elaborano e descrivono i dati basati sulla componente XML dei dati di un malfunzionamento. Un esempio è WS-Security. Da dove viene MTOM Come In MTOM (SOAP Message Transmission Optimization Mechanism) è un'altra specifica che si concentra sulla soluzione del problema quotAttachmentsquot. MTOM cerca di sfruttare i vantaggi di queste due tecniche, cercando di unire le due tecniche. MTOM è in realtà un metodo quotby referencequot. Il filo formato di un messaggio MTOM ottimizzato è lo stesso del SOAP con il messaggio allegate, che rende anche compatibile con gli endpoint SWA. La caratteristica più notevole di MTOM è l'uso del XOP: Include elemento, che è definito nella specifica Packaging Binary XML ottimizzato (XOP) per fare riferimento gli allegati binari (entità generali unparsed esterni) del messaggio. Con l'uso di questo elemento esclusiva, il contenuto binario divisoria diventa logicamente in linea (in valore) con il documento SOAP anche se è effettivamente collegato separatamente. Questo unisce i due mondi, rendendo possibile lavorare solo con un modello di dati. Questo permette alle applicazioni di elaborare e descrivere da solo guardando la parte XML, rendendo la dipendenza da DTD obsoleto. Su una nota più leggera, MTOM ha standardizzato il meccanismo riferimento di SWA. Quanto segue è un estratto dalla specifica XOP. A livello concettuale, questi dati binari possono essere pensati come essere codifica Base64 nel documento XML. Poiché questa forma concettuale potrebbe essere necessario durante alcune elaborazioni del documento XML (ad esempio per la firma del documento XML), è necessario avere una corrispondenza uno-a-uno tra Infoset XML e Pacchetti XOP. Pertanto, la rappresentazione concettuale di tali dati binari è come se fosse con codifica Base64, utilizzando il modulo lessicale canonica del tipo di dati XML Schema base64Binary (vedi XML Schema Part 2: Datatypes Second Edition 3.2.16 base64Binary). In direzione opposta, XOP è in grado di ottimizzare i dati solo Infoset codifica base64 che è nella forma lessicale canonica. Apache Axis2 supporta la codifica Base64. SOAP con allegati e MTOM (SOAP Message Transmission Optimization Mechanism). MTOM con Axis2 modello di programmazione AXIOM è (e può essere il primo) Object Model che ha la capacità di tenere i dati binari. Ha questa capacità come OMText può contenere contenuto binario grezzo in forma di javax. activation. DataHandler. OMText è stato scelto per questo scopo con due motivi. Uno è che XOP (MTOM) è in grado di ottimizzare solo i dati Infoset codifica base64 che è in forma lessicale canonica di XML Schema base64Binary tipo di dati. Altro è quello di preservare la infoset sia il mittente e il destinatario. (Per memorizzare il contenuto binario nello stesso tipo di oggetto, indipendentemente dal fatto che sia ottimizzato o no). MTOM permette di codificare in modo selettivo parti del messaggio, che ci permette di inviare i dati base64encoded così come dati binari grezzi collegati esternamente a cui fa riferimento l'elemento quotXOPquot (contenuti ottimizzati) da inviare in un messaggio SOAP. È possibile specificare se un nodo OMText che contiene dati binari grezzi o dati binari base64encoded è qualificato per essere ottimizzato al momento della costruzione di quel nodo o poi. Per l'efficienza ottimale di MTOM, si consiglia un utente di inviare allegati binari più piccoli che utilizzano base64encoding (non ottimizzato) e gli allegati più grandi come contenuto ottimizzato. Inoltre, un utente può creare un nodo di contenuto binario ottimizzabile utilizzando una stringa codificata base64, che contiene contenuto binario codificato, dato con il tipo MIME della rappresentazione binaria effettiva. Axis2 utilizza javax. activation. DataHandler per gestire i dati binari. Tutti i nodi di contenuti binari ottimizzati verranno serializzati come Base64 stringhe se quotMTOM non è enabledquot. È inoltre possibile creare nodi di contenuto binario, che non sarà ottimizzata in ogni caso. Saranno serializzati e inviati come stringhe Base64. L'attivazione di ottimizzazione MTOM sul lato client In Opzioni, impostare la proprietà quotenableMTOMquot su True quando si inviano messaggi. Quando questa proprietà è impostata su True, qualsiasi busta SOAP, indipendentemente dal fatto che contiene contenuti ottimizzabile o no, verrà serializzato come un messaggio MIME MTOM ottimizzato. Axis2 serializza tutti i nodi di contenuti binari come Base64 codificato stringhe indipendentemente dal fatto che sono qualificati per essere ottimizzato o no se la proprietà quotenableMTOMquot è impostata su False. Se la busta contiene tutti gli elementi di informazione elemento del nome XOP: Include (vedi XML-binary Optimized Packaging 3. XOP infoset costrutti). L'utente non deve specificare nulla in modo che Axis2 di ricevere messaggi MTOM ottimizzato. Axis2 identificherà automaticamente e de-serializzare di conseguenza, come e quando arriva un messaggio MTOM. L'attivazione di ottimizzazione MTOM sul lato server Il server Axis 2 identifica automaticamente i messaggi in arrivo MTOM ottimizzato in base al tipo di contenuto e li de-serializza di conseguenza. L'utente può enableMTOM sul lato server per i messaggi in uscita, per enableMTOM a livello globale per tutti i servizi, gli utenti possono impostare il parametro quotenableMTOMquot su True nel Axis2.xml. Quando è impostato, tutti i messaggi in uscita vengono serializzati e inviati come messaggi MIME MTOM ottimizzato. Se non è impostata, tutti i dati binari nei nodi di contenuti binari verranno serializzati come stringhe Base64 codificati. Questa configurazione può essere sovrascritto nel services. xml in base al servizio e per operazione. È necessario riavviare il server dopo aver impostato questo parametro. Accesso ai dati ricevuti binario (codice di esempio) Im scrivendo un semplice web server in python che consente all'utente di caricare un file utilizzando multipartform-dati. Per quanto posso dire, i dati MIME multipart dovrebbe essere basata linea. Per esempio, il limite deve essere all'inizio di una riga. Non riesco a capire come i dati binari viene gestita in questo senso. Il mio cliente (Firefox) non è la codifica in ASCII 7bit o nulla, i suoi dati binari grezzi solo il suo invio. Lo fa dividere i dati in linee a posizioni arbitrarie Esiste una lunghezza massima di riga specificato per i dati più parti Ive ha provato guardando attraverso la RFC per multipartform-dati, ma non ha ancora trovato nulla. chiesto 27 marzo 13 al 16:54 Dopo aver scavato attraverso le RFC, penso che finalmente ho avuto tutto dritto nella mia testa. Le parti del corpo (cioè il contenuto del corpo di una singola parte in un messaggio concatenato) devono solo essere basata line che il confine alla fine della parte inizia con un CRLF. Ma per il resto, i dati non devono essere line-based, e se il contenuto succede ad avere a capo in esso, non c'è distanza massima tra di loro, né hanno bisogno di essere sfuggito a ogni modo (beh, se non forse il Content-Transfer - Codifica è quotata-string). I 7-bit, 8-bit, e le opzioni binarie per Content-Transfer-Encoding dont in realtà indicano che qualsiasi codifica è stato fatto sui dati (e quindi nessuna codifica deve essere annullata), stanno solo dire per indicare il tipo di dati si può aspettare di vedere nella parte del corpo. Quello che mi è stato davvero sempre a nella mia interrogazione scarsamente espresso era come LeggiBuffer i dati della presa di modo che io possa fare in modo ho raggiunto il limite, e senza dover avere un arbitrariamente grande di buffer (ad esempio se ci è capitato di essere non linebreaks a il contenuto, e quindi una readline finito per il buffering l'intera cosa). Quello che ho finito per fare era il buffering dalla presa con un readline usando una lunghezza massima, in modo che il tampone non sarebbe mai più lungo di quello, ma sarebbe anche fare in modo di interrompere, se è stato rilevato un interruzione di riga. Questo garantisce che quando il confine venuto (dopo un CRLF), sarebbe all'inizio del buffer. Ho dovuto fare un po 'di più monkeying intorno al fine di garantire che non ho includo CRLF finale nel contenuto effettivo corpo, perché secondo la RFC sua richiesta prima del confine, e quindi non fa parte del contenuto stesso. ha risposto 5 Apr 13 ad 12:02 Prova rivedere RFC 2045. In genere, il contenuto binario viene convertito in BASE64 dall'applicazione e incluso nel messaggio a più parte utilizzando Content-Transfer-Encoding. Base64. Ci sono altri meccanismi per trasferire dati binari, ma questo è abbastanza comune. Dati binari sono convertiti in ottetti e chunked in stringhe di lunghezza arbitrari (a seconda della variante di codifica - vedi il link BASE64 sopra). L'applicazione ricevente poi lo decodifica nel contenuto binario originale. Io non sono un programmatore python, ma sarei sorpreso che realmente doveva codificare tutto questo da soli. Ho il sospetto che ci sono predefinite funzioni di libreria Python per fare questo per voi. risposto 27 marzo 13 alle 17:43 Grazie, stavo guardando un RFC diverso che non era come informativo. Ho anche trovato RFC 2046 che definisce specificamente messaggi concatenati nella sezione 5. Nota there39s un po 'di una sottigliezza in questi RFC che attraverso di me fuori: si dice messaggi in più non possono avere codifiche diverse da 7-bit, 8-bit, e binari (cioè non in base 64). Tuttavia, si continua a dire che le singole parti all'interno della parte più possono avere proprio lì content-codifiche, così si è corretto che Base-64 è possibile. ndash brianmearns 28 Mar 13 ad 13:20 tua risposta 2017 Stack Exchange, IncDescription intestazione void (string string, bool sostituire vero, int httpresponsecode) un colpo di testa () viene utilizzato per inviare un'intestazione HTTP grezzo. Vedere le specifiche raquo HTTP1.1 per ulteriori informazioni su intestazioni HTTP. Ricordate che intestazione () deve essere chiamato prima di ogni uscita effettiva viene inviato, sia da normali tag HTML, righe vuote in un file, o da PHP. Si tratta di un errore molto comune leggere codice con includere. o richiedere. funzioni o un'altra funzione di accesso ai file, e hanno spazi o righe vuote che sono uscita prima di intestazione () viene chiamato. Lo stesso problema esiste quando si utilizza un singolo file PHPHTML. lthtmlgt ltphp Questo darà un errore. Si noti l'output sopra, che è prima l'intestazione chiamata intestazione () (in posizione: esempio) uscita gt Parametri La stringa di intestazione. Ci sono due chiamate di intestazione speciale e minuscole. Il primo è un colpo di testa che inizia con la stringa di HTTP quot quot (caso non è rilevante), che sarà utilizzato per capire il codice di stato HTTP per inviare. Ad esempio, se è stato configurato Apache per utilizzare uno script PHP per gestire le richieste di file mancanti (usando la direttiva ErrorDocument), si consiglia di fare in modo che lo script genera il codice di stato corretto. ltphp intestazione (HTTP1.0 404 Not Found) gt Il secondo caso particolare è il quotLocation: intestazione quot. Non solo inviare questa intestazione al browser, ma restituisce anche un codice di stato REDIRECT (302) per il browser a meno che il 201 o un codice di stato 3xx è già stata impostata. intestazione ltphp (Località: esempio) redirect del browser Assicurarsi che il codice qui sotto non viene eseguito quando ci reindirizzamento. uscita gt Il parametro opzionale sostituire indica se l'intestazione deve sostituire una precedente un'intestazione simile, o aggiungere un secondo collettore dello stesso tipo. Per impostazione predefinita, che andrà a sostituire, ma se si passa a FALSE come secondo argomento è possibile forzare più intestazioni dello stesso tipo. Per esempio: intestazione ltphp (WWW-Authenticate: negoziazione) un colpo di testa (WWW-Authenticate:. NTLM false) gt Forza il codice di risposta HTTP al valore specificato. Si noti che questo parametro ha effetto solo se la stringa non è vuota. È importante notare che le intestazioni siano effettivamente inviate quando il primo byte è output al browser. Se si sta sostituendo le intestazioni negli script, questo significa che il posizionamento di dichiarazioni echoprint e buffer di uscita potrebbe in realtà avere un impatto che le intestazioni vengono inviati. Nel caso di reindirizzamenti, se si dimentica di terminare lo script dopo l'invio l'intestazione, l'aggiunta di un buffer o l'invio di un personaggio può cambiare quale pagina gli utenti vengono inviati. Questo reindirizza al 2.html fin dalla seconda intestazione sostituisce la prima. intestazione ltphp (posizione: 1.html) un colpo di testa (posizione: 2.html) sostituisce 1.html gt Questo reindirizza al 1.html poiché l'intestazione viene inviato non appena l'eco accade. È anche solito vedere ogni headers already sent errori perché il browser segue il reindirizzamento prima di poter visualizzare l'errore. ltphp intestazione (posizione: 1.html) eco inviare intestazione dati (posizione: 2.html) 1.html già spedito gt Wrapping dell'esempio precedente in un buffer di uscita in realtà cambia il comportamento dello script Questo perché le intestazioni arent inviate fino all'uscita buffer viene svuotato. ltphp obstArt () un colpo di testa (posizione: 1.html) echo inviare intestazione dati (posizione: 2.html) sostituisce obendflush 1.html () ora le intestazioni vengono inviati GT I miei file sono in uno stato compresso (bz2). Quando l'utente fa clic sul collegamento, voglio loro di ottenere la versione non compressa del file. Dopo la decompressione del file, mi sono imbattuto nel problema, che il dialogo di download sarebbe sempre pop-up, anche quando ho detto che la finestra di dialogo per eseguire sempre questa operazione con questo tipo di file. Come ho scoperto, il problema era nella direttiva header Content-Disposition, vale a dire la direttiva allegato. Se volete che il vostro browser per simulare un collegamento semplice a un file, modificare attaccamento alla linea o omettere alltogether e youll andare bene. Questo mi ha portato un po 'per capire e spero che aiutare qualcun altro là fuori, che gestisce lo stesso problema. Salvataggio di file php in ANSI non isuess ma quando si salva il file in formato UTF-8 per vari motivi ricordatevi di salvare il file senza alcun supporto BOM (contrassegno ordine di byte). In caso contrario, si dovrà affrontare problemi di intestazioni non essere correttamente inviati ad es. intestazione ltphp (Set-Cookie: nomeutente) gt darebbe qualcosa di simile: - Attenzione: Non è possibile modificare le informazioni di intestazione - headers already sent by (output iniziato in C: wwwinfo. php: 1) in C: wwwinfo. php sulla linea 1 Secondo per la RFC 6226 (tools. ietf. orghtmlrfc6266), l'unico modo per inviare Content-Disposition con la codifica è: Content-Disposition: attachment filename UTF-8e282ac20rates per la compatibilità a ritroso, quello che dovrebbe essere inviata è: Content-Disposition: attachment filenameEURO tariffe filenameutf-8e282ac20rates di conseguenza, dovremmo usare ltphp nome del file. exe un nome in caratteri cinesi contentDispositionField Content-Disposition: attachment. sprintf (i nomi dei file. rawurlencode (nome del file)). (. Filenameutf-8s rawurlencode (nome del file)) sprintf intestazione (Content-Type: applicationoctet-stream) readfile (filetodownload. exe) gt Ho testato il codice in IE6-10, Firefox e Chrome. Per i file di grandi dimensioni (100 MB), ho scoperto che è essenziale per svuotare il contenuto del file ASAP, altrimenti la non mostra dialogo di download fino ad un lungo periodo di tempo o mai più. ltphp intestazione (Content-Disposition: attachment filename UrlEncode (file).) un colpo di testa (Content-Type: applicationforce-download) un colpo di testa (Content-Type: applicationoctet-stream) un colpo di testa (Content-Type: applicationdownload) un colpo di testa (Content-Descrizione: File transfer) un colpo di testa (Content-Length:. Dimensione File (file)) a filo () questo realmente non importa. fp fopen (file. r), mentre (feof (fp)) echo fread (fp. 65536) a filo () questo è essenziale per download di grandi dimensioni fclose (fp) GT Se non avete usato, di risposta HTTP 204 può essere molto conveniente. 204 indica al server di termiante immediatamente tale richiesta. Questo è utile se si desidera un JavaScript (o simile) la funzione sul lato client per eseguire una funzione sul lato server senza aggiornare o cambiare la pagina Web corrente. Grande per l'aggiornamento del database, impostare le variabili globali, ecc intestazione (stato: 204) (o l'altra chiamata) un colpo di testa (HTTP1.0 204 No risposta) Una chiamata a sessionwriteclose () prima che l'intestazione dichiarazione ltphp (Location: URL) uscita ( ) gt è consigliata se si vuole essere sicuri che la sessione viene aggiornato prima di procedere al reindirizzamento. Abbiamo incontrato una situazione in cui lo script si accede dal reindirizzamento non era caricare la sessione correttamente perché lo script precedente hadnt il tempo di aggiornarlo (abbiamo usato un gestore di database). Giusto per informare tutti voi, non confondersi tra Content-Transfer-Encoding e Content-Encoding Content-Transfer-Encoding specifica la codifica utilizzata per trasferire i dati all'interno del protocollo HTTP, come binario crudo o Base64. (Binario è più compatto rispetto Base64. Base64 con 33 in testa). Ad esempio l'uso: - intestazione (Content-Transfer-Encoding: binario) Content-Encoding viene utilizzato per applicare le cose come la compressione gzip al contentData. Ad esempio l'uso: - intestazione (Content-Encoding: gzip) È possibile utilizzare HTTPs ETAGs e l'ultima data modificata per garantire che non sei l'invio dei dati del browser che ha già nella cache. ltphp lastmodifiedtime filemtime (file) ETAG md5file (file) un colpo di testa (Last-Modified:. gmdate (D, D MYH: I:. s lastmodifiedtime) GMT.) un colpo di testa (Etag: ETAG) se (strtotime (SERVER HTTPIFMODIFIEDSINCE) lastmodifiedtime assetto ( SERVER HTTPIFNONEMATCH) ETAG) un colpo di testa (HTTP1.1 304 Not Modified) uscita gt Se si desidera rimuovere un colpo di testa e tenerlo da essere inviato come parte della risposta di testa, basta fornire nulla in quanto il valore di intestazione dopo il nome di intestazione. Per esempio. PHP, per impostazione predefinita, restituisce sempre la seguente intestazione: Quale la vostra intera risposta di intestazione sarà simile HTTP1.1 200 OK Server: Apache2.2.11 (Unix) X-Powered-By: PHP5.2.8 Data: Fri, 16 ottobre 2009 23: 05:07 GMT Content-Type: texthtml charsetUTF-8 Connection: close Se si chiama il nome di intestazione con nessun valore in questo modo. Le intestazioni ora appaiono così: HTTP1.1 200 OK Server: Apache2.2.11 (Unix) X-Powered-By: PHP5.2.8 Data: Fri, 16 ottobre 2009 23:05:07 GMT Connection: close voglio solo aggiungere , becuase vedo qui un sacco di intestazioni sbagliato formattati. 1. intestazioni Tutto utilizzati hanno prime lettere maiuscole, quindi è necessario seguire questa. Per esempio: posizione, non luogo Content-Type, non del tipo di contenuto, né Content-Type 2. allora ci deve essere del colon e dello spazio, come bene: intestazione (Content-Type: textplain) sbagliato: intestazione (Content-Type: textplain ) 3. intestazione posizione deve essere URI assoluto con lo schema, dominio, porto, percorso, ecc 4. URI relativa non sono consentiti sbagliato: Posizione: sbagliato something. phpa1: Posizione. a1 Si farà client server proxy HTTP e più felice. Dopo un sacco di ricerca e sperimentazione, Id piace condividere le mie scoperte per i miei problemi con Internet Explorer e il download di file. Date un'occhiata a questo codice, che replica la normale download di un JavaScript: ltphp se (strstr (SERVER HTTPUSERAGENT, MSIE) false) un colpo di testa (Content-type: textjavascript) un colpo di testa (Content-Disposition: filenamedownload. js in linea) un colpo di testa (Contenuto - Lunghezza:. filesize (my-file. js)) altro colpo di testa (Content-type: applicationforce-download) un colpo di testa (Content-Disposition: filenamedownload. js di fissaggio) un colpo di testa (Content-Length:. filesize (my-file. js) ) un colpo di testa (Scadenza: dom, 1 gen 2010 05:00:00 GMT) se (strstr (HTTPUSERAGENT SERVER, MSIE) false) un colpo di testa (cache-Control: no-cache) un colpo di testa (Pragma: no-cache) comprendono (mio - file. js) Gt ora mi spiego: mi metto fuori controllando per IE, quindi se non IE, ho impostato Content-type (maiuscole e minuscole) per JS e impostare Content-Disposition (ogni intestazione è maiuscole e minuscole da ora in poi ) inline, perché la maggior parte dei browser al di fuori di IE, come per visualizzare JS in linea. (L'utente può modificare le impostazioni). L'intestazione Content-Length è richiesto da alcuni browser per attivare casella di download. Poi, se si tratta di IE, il applicationforce-download Content-type a volte è necessario per mostrare la casella di download. Utilizzare questo se non volete il PDF per visualizzare nel browser (in IE). Io lo uso qui per assicurarsi che apre la scatola. In ogni caso, ho impostato la Content-Disposition all'attaccamento perché so già che verrà visualizzata la casella. Poi ho di nuovo il Content-Length. Ora, ecco il mio grande punto. Ho le intestazioni Cache-Control e Pragma inviati solo se non IE. Queste intestazioni impedirà il download su IE. Utilizzare solo l'intestazione scade, dopo tutto, sarà necessario il file da scaricare di nuovo la prossima volta. Questo non è un bug di IE memorizza download nella cartella dei file temporanei Internet fino a quando il download è completato. Lo so perché una volta ho scaricato un file enorme di documenti, ma il dialogo Download dialogo messo nella cartella Temp e si è trasferito alla fine. Basti pensare a questo proposito. Se Internet Explorer richiede il file da scaricare nella cartella Temp, impostando gli header Cache-Control e Pragma causerà un errore Spero che questo consente di risparmiare qualcuno un po 'di tempo qui è uno script PHP che ho scritto per lo streaming di un file e la cripta con un'operazione di XOR sui byte con un tasto. La crittografia funziona molto bene, ma la velocità è diminuire di 2, è ora 520KiBs. L'utente è ormai richiesta una password md5 (invece di mantenere nel codice direttamente). Vi è una certa parte in francese perché il suo mia lingua madre in modo modificarlo come si desidera. file ltphp streaming e crittografare i dati on-the-fly Impostazioni - file per lo streaming di file FileOut - Lettura del buffer BufferLength 3840 - chiave in esadecimale KeyChar 9cdfb439c7876e703e307864c9167a15 Funzione: Conversione chiave esagonale in una stringa in funzione HEX2BIN binario (h) se ( IsString (h)) restituire null r array () per (a 0 (2) lt strlen (h) a) ta hexdec (h 2 a) hexdec tb (h (2 a 1)) ra (int) ((ta LTLT 4) TB) return r funzione per inviare le intestazioni auth funzionano AskPassword (testo Inserire l'intestazione password) (WWW-Authenticate:.. intestazione regno base utf8decode (testo)) (HTTP1.0 401 non autorizzato) di ritorno 1 chiave è invitato a la prima partenza if (isset (PHPAUTHPW SERVER)) AskPassword () eco Une cl est ncessaire LTBR gt uscita ottenere la chiave in esadecimale KeyChar SERVER PHPAUTHPW Converti chiave e impostare la dimensione della HEX2BIN tasto (KeyChar) keylength contare (chiave) Teste si la cl est Valide en esagono se (chiave keylength lt 4) AskPassword (Cl incorrecte) eco Cl incorrecte LTBR gt exit () Teste si la cl est de longueur duna puissance de 2 if ((keylength 2) 0) AskPassword (Cl de longueur incorrecte (più de 2 uniquement)) echo Cl de longueur incorrecte (puissance de 2 uniquement) uscita LTBR gt () un colpo di testa intestazioni (Content-Type: (Content-Transfer-Encoding applicationoctet-stream): binario) un colpo di testa (Content lunghezza:. filesize (file). ) Un colpo di testa (il nome del file. File). Flush () questo realmente non importa. Aprire il file in lettura solo fp fopen (file. R), mentre (feof (fp)) Leggere una dimensione del buffer del buffer di file di fread (fp. BufferLength) j 0 per (i 0 i lt BufferLength i) La chiave viene letta in loop per criptare l'intero file se (i keylength 0) j 0 Applicare una operazione XOR tra la chiave e il file da criptare Questa operazione mangia un sacco di tempo di CPU (stream a 1MiBs sul mio server Intel E2180) tmp pack (C. j chiave) Buffère (buffer di i tMP) lt le fameux XOR Invia i dati crittografati eco Buffère Pulire la memoria Buffère buffer di j flush () questo è essenziale per download di grandi dimensioni fclose (fp) exit () Chiudere il file e la sua fclose finiti (fp ) EVITARE ZERO Byte Order Mark intestazione deve essere inviata prima di tutto nella pagina. Anche un singolo spazio si romperà lo script. Nel mio caso, non vi era distinta, incastonato nella codifica, così ho aperto il file con notepad e impostare la codifica UTF-8 (senza BOM) e voilà, tutto funziona grande ora. Ho passato molto tempo a cercare di determinare perché Internet Explorer 7 non era chiedendo all'utente di salvare un download in base al nome del file specificato su un Content-Disposition: attachment filename. riga di intestazione. Alla fine ho deciso che la mia installazione di Apache è stata l'aggiunta di un'intestazione aggiuntiva: Vary: Host, che è stato gettando IE - come da support. microsoftkb824847 ho trovato impostare manualmente l'intestazione Vary dall'interno PHP come segue intestazione (Vary: User-Agent) ha permesso di IE comportarsi come previsto. Spero che questo consente di risparmiare un altro po 'di tempo, la codifica di un file viene scoperto dal Content-Type, sia nel meta-tag HTML o come parte dell'intestazione HTTP. Così, il server e il browser non ha bisogno - né si aspettano - un file Unicode per iniziare con un segno di distinta base. BOM possono confondere i sistemi nix troppo. Maggiori informazioni presso unicode. orgfaqutfbom. htmlbom1 In un'altra nota: Safari in grado di visualizzare le immagini CMYK (almeno la versione OS X, perché utilizza i servizi di QuickTime), ottenendo un colpo di testa posizione restituisce un reindirizzamento (302) codice di stato al browser a meno che il 201 o un codice di stato 3xx è già stata impostata. Se si invia una risposta a una richiesta POST, si potrebbe desiderare di guardare RFC 2616 sezioni 10.3.3 e 10.3.4. Si suggerisce che se si desidera che il browser per ottenere immediatamente la risorsa nell'intestazione Location in questa circostanza, è necessario utilizzare un codice di stato 303 non il 302 (con lo stesso collegamento come ipertestuale nel corpo per molto vecchi browser). Questo può avere conseguenze (rare) come indicato nel bug 42969.

No comments:

Post a Comment