Ho bisogno di Content-Type: application / octet-stream per il download dei file?


414

Lo standard HTTP dice:

Se questa intestazione [Content-Disposition: allegato] viene utilizzata in una risposta con il tipo di contenuto application / octet-stream, il suggerimento implicito è che l'agente utente non dovrebbe visualizzare la risposta, ma inserire direttamente una `salva risposta come .. . ".

L'ho letto come

Content-Type: application/octet-stream
Content-Disposition: attachment

Ma avrei pensato che Content-Typesarebbe stato application/pdf, image/pnge così via

Dovrei avere Content-Type: application/octet-streamse voglio che i browser scarichino il file?

Risposte:


959

No.

Il tipo di contenuto dovrebbe essere quello che è noto, se lo conosci. application/octet-streamè definito come "dati binari arbitrari" in RFC 2046, e qui c'è una chiara sovrapposizione che è appropriata per le entità il cui unico scopo è quello di essere salvate su disco, e da quel momento in poi al di fuori di qualsiasi cosa "webby". O guardarlo da un'altra direzione; l'unica cosa che si può fare in sicurezza con application / octet-stream è salvarlo su file e sperare che qualcun altro sappia a cosa serve.

È possibile combinare l'uso di Content-Dispositioncon altri tipi di contenuto, come image/pngo anche text/htmlper indicare che si desidera salvare anziché visualizzare. In passato alcuni browser lo ignoravano, text/htmlma penso che questo fosse molto tempo fa a questo punto (e vado a letto presto, quindi non inizierò a testare un sacco di browser adesso; forse più tardi).

RFC 2616 menziona anche la possibilità di token di estensione, e oggigiorno la maggior parte dei browser riconosce inlineche vuoi che l'entità venga visualizzata se possibile (cioè, se è un tipo che il browser sa come visualizzare, altrimenti non ha scelta in merito) . Questo è ovviamente il comportamento predefinito, ma significa che puoi includere la filenameparte dell'intestazione, che i browser useranno (forse con qualche aggiustamento in modo che le estensioni dei file corrispondano alle norme di sistema locali per il tipo di contenuto in questione, forse no) come suggerimento se l'utente tenta di salvare.

Quindi:

Content-Type: application/octet-stream
Content-Disposition: attachment; filename="picture.png"

Significa "Non so che diavolo sia. Per favore, salvalo come file, preferibilmente chiamato picture.png".

Content-Type: image/png
Content-Disposition: attachment; filename="picture.png"

Significa "Questa è un'immagine PNG. Per favore salvala come file, preferibilmente chiamato picture.png".

Content-Type: image/png
Content-Disposition: inline; filename="picture.png"

Significa "Questa è un'immagine PNG. Per favore visualizzala a meno che tu non sappia come visualizzare immagini PNG. Altrimenti, o se l'utente sceglie di salvarla, raccomandiamo il nome picture.png per il file con cui la salvi".

Di quei browser che riconoscono inlinealcuni lo userebbero sempre, mentre altri lo userebbero se l'utente avesse selezionato "salva collegamento come" ma non se avessero selezionato "salva" durante la visualizzazione (o almeno IE lo fosse, potrebbe essere cambiato alcuni anni fa).


30
Questa è stata un'ottima risposta, e sarebbe davvero bello se le cose funzionassero così. Ma sfortunatamente tutti i browser sono per lo più rotti. Ad esempio, Google Chrome non aprirà una finestra di "salvataggio file" per te se questa è la tua risposta da un modulo, indipendentemente dall'inclusione di "Content-Disposition: allegato", anche con "application / octet-stream" come tipo di contenuto . E poi stampano un messaggio che dice che potresti essere sotto attacco ... Non c'è modo di lasciarmi salvare un file. Devi configurare xdg-open anche se vuoi solo salvare un file. Sono stufo di questo.
dividebyzero

1
@dividebyzero non è mai stato un problema, anche con Chrome. C'è qualcos'altro di insolito in quello che stai facendo?
Jon Hanna,

1
Il caricamento di un file con l'enctype predefinito sarebbe errato e forse il risultato di ciò ha innescato un rilevamento degli attacchi, piuttosto che cadere semplicemente per rendere disponibili i contenuti del file.
Jon Hanna,

7
@Wilt se il client vuole salvarlo, non importa quali intestazioni vengono inviate (puoi "salvare" o "salva link come" su qualsiasi cosa nel tuo browser), poiché le intestazioni sono informazioni, non regole, quindi attachmentpotrebbero essere considerato "meglio non mostrarlo da soli" mentre inline"meglio mostrarlo da soli se è possibile". In entrambi i casi, la maggior parte dei browser utilizzerà il valore del nome file come nome suggerito del file, ma gli utenti possono sempre sovrascriverlo.
Jon Hanna,

1
@Tresdin grazie. Sono un po 'perplesso che è così popolare, rispetto ad alcuni dei miei altri che prenderei in considerazione meglio, ma suppongo che debba aver toccato il punto di rispondere ai problemi della gente.
Jon Hanna,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.