2009-10-13 14 views
15

Sto riscontrando un problema con un download di file in cui il download sta sostituendo tutti gli spazi con caratteri di sottolineatura.Perché HttpUtility.UrlEncode (HttpUtility.UrlDecode ("% 20")) restituisce + anziché% 20?

Fondamentalmente sto diventando un problema qui:

Response.AddHeader("Content-Disposition", 
    "attachment; filename=" + someFileName); 

Il problema è che se someFileName avesse uno spazio in esso come "controllare questo out.txt", allora l'utente verrebbe richiesto di scaricare "check_this_out .testo".

ho pensato che la soluzione migliore sarebbe quella di UrlEncode il nome del file così ho provato

HttpUtility.UrlEncode(someFileName); 

ma è di sostituire gli spazi con segni più, che mi ha messo in difficoltà. Allora ho appena provato

HttpUtility.UrlEncode(HttpUtility.UrlDecode("%20")) 

e la decodifica funziona correttamente e mi dà uno spazio, ma la codifica prende lo spazio e poi mi dà di nuovo il segno più.

Cosa mi manca qui, è corretto? Se è così, come dovrei codificare correttamente gli spazi in% 20, che è ciò di cui ho bisogno.

risposta

6

Citando this link

ho incontrato io stesso. Se lo è in grado di modificare gli spazi in% 20s , IE7 li convertirà correttamente. Firefox li prenderà letteralmente letteralmente (almeno quando si utilizza l'intestazione Content-Disposition ) in modo che lo si faccia per le richieste da IE7.

Abbiamo fatto quanto segue nella nostra app. (Un archivio di documenti basata Tomcat)

String userAgent = request.getHeader("User-Agent"); 
if (userAgent.contains("MSIE 7.0")) { 
    filename = filename.replace(" ", "%20");  
}   
response.addHeader("Content-disposition", 
    "attachment;filename=\"" + filename + "\""); 
+0

Grazie, ho trovato questo in un altro articolo altrove con la stessa soluzione che hai. Probabilmente finirò per doverlo fare, ma mi sembra solo sbagliato/sporco. Oh bene. – Joseph

16

Fondamentalmente entrambi% 20 e + sono metodi validi per codificare uno spazio. Ovviamente il metodo UrlEncode deve scegliere uno delle opzioni ... se ha scelto di fare il contrario, qualcun altro avrebbe chiesto il motivo per cui UrlEncode(UrlDecode("+")) restituito "% 20" ...

Si può sempre codificare, poi basta sostituire una stringa diritta su "+" per "% 20". Io penso che avrebbe funzionato ...

+1

Grazie Jon. Il problema che sto vedendo però è che dal momento che sta scegliendo di andare con il +, il mio file appare come "check + this + out.txt" invece che con spazi, che è l'obiettivo che sto cercando di raggiungere. – Joseph

+0

@Joseph: come detto da Jon, "" è sostituito da "+"; quando provi a scappare "+", andrai con "% 2B" –

+0

@Rubens Capisco, ma ciò non risolve il mio problema. O lo codifico e il mio file viene chiamato "check + this + out.txt" o non lo codifica e viene chiamato "check_this_out.txt". Come faccio a mostrare correttamente lo spazio bianco? – Joseph

9

ho pensato che la soluzione migliore sarebbe quella di UrlEncode il nome del file

Questo non è il modo giusto per mettere i caratteri out-of-band un parametro di intestazione come Content-Disposition-filename, e funziona solo (a volte) in IE a causa di un bug. In realtà è un po 'un problema perenne: there is no right way.

Se è necessario inserire caratteri speciali nel nome file scaricato, non è possibile farlo in modo affidabile con Content-Disposition-filename. Invece, ometti il ​​parametro 'filename' dall'intestazione Content-Disposition-attachment e lascia il nome del file che vuoi nella parte finale dell'URL.In assenza di un parametro filename, il browser lo prenderà dal percorso URL, dove codifica URL è il modo giusto per affrontare caratteri speciali.

2

Ciao Ho anche affrontato lo stesso tipo di problema durante il download dei file con spazi in loro.

Si prega di vedere il collegamento che meglio suite e dà la risposta completa.

http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download

Per motivi di comprensione sto solo aggiungendo il codice ASP.net come risolvere questo problema.

string document = @"C:\Documents and Settings\Gopal.Ampolu\My Documents\Downloads\" + "Disciplinary & Grievance Procedures..doc"; 
string filename = "Disciplinary & Grievance Procedures..doc"; 

Response.ContentType = mimeType; 
Response.AddHeader("Content-Disposition", @"attachment; filename=""" + HttpUtility.UrlDecode(filename) + @""""); 
Response.Flush(); 

Da quanto sopra si può vedere che, mentre l'aggiunta di intestazione alla risposta, il nome del file è racchiuso tra virgolette doppie. Assicurati che il "nome file" debba essere decodificato con UrlDecode.

1

più Una possibilità è anche lì, se si può intime clienti circa l'aggiornamento delle finestre di aggiornamento rapido disponibili presso seguente:

Windows Hotfix Update for IE white space issue

E 'lato client, in modo da non essere applicabile a tutti gli scenari ma pur sempre un opzione se fattibile.

Problemi correlati