2012-02-22 9 views
9

Memorizziamo un gruppo di nomi di documenti bizzarri sul nostro server web (persone che li caricano) che hanno vari caratteri come spazi, e commerciali, ecc. Quando generiamo collegamenti a questi documenti, dobbiamo evitarli in modo che il server possa cercare file con il suo nome non elaborato nel database. Tuttavia, nessuna delle funzioni di escape integrate in .NET funzionerà correttamente in tutti i casi.Come si fa a uscire correttamente il nome di un documento in .NET?

Prendere il documento Hello#There.docx:

UrlEncode gestirà questo correttamente:

HttpUtility.UrlEncode("Hello#There"); 
"Hello%23There" 

Tuttavia, UrlEncode sarà non maniglia Hello There.docx correttamente:

HttpUtility.UrlEncode("Hello There.docx"); 
"Hello+There.docx" 

Il simbolo + è valida solo per i parametri URL, non d nomi di ocument. È interessante notare che questo funziona effettivamente sul server Web di test di Visual Studio ma non su IIS.

La funzione UrlPathEncode funziona bene per gli spazi:

HttpUtility.UrlPathEncode("Hello There.docx"); 
"Hello%20There.docx" 

Tuttavia, non sfuggirà altri personaggi come il carattere #:

HttpUtility.UrlPathEncode("Hello#There.docx"); 
"Hello#There.docx" 

Questo link non è valido come il # viene interpretato come un URL hash e non arriva nemmeno al server.

Esiste un metodo di utilità .NET per sfuggire a tutti i caratteri non alfanumerici nel nome di un documento o dovrei scrivere il mio?

+1

Come si gestiscono i duplicati se gli utenti caricano file con lo stesso nome? Non sarebbe più semplice generare a macchina i nomi (come un guid, per esempio) e memorizzare il nome amichevole, fornito dall'utente, nel database (insieme al nome del file generato)? –

+0

probabilmente Hai bisogno di qualcosa di simile [Rimuovere i caratteri non validi Dal tracciato e nomi di file] [1] [1]: http://stackoverflow.com/questions/146134/how-to-remove-illegal-characters -from-path-and-filenames –

+0

@KirkWoll - Buona domanda :) L'URL * effettivamente * assomiglia a '/ Docs/12345/My File.docx' - Il 12345 è una chiave univoca, ma noi vogliamo l'IE" Salva come "finestra di dialogo per salvare il file con lo stesso nome caricato originariamente. Verifichiamo anche che il nome del file corrisponda alla chiave per impedire alle persone di indovinare solo documenti casuali (sì, non sicuri al 100% ma sufficienti) .. –

risposta

14

Date un'occhiata al Uri.EscapeDataString Method:

Uri.EscapeDataString("Hello There.docx") // "Hello%20There.docx" 

Uri.EscapeDataString("Hello#There.docx") // "Hello%23There.docx" 
+1

Lei, signore, sono un gentiluomo e uno studioso. –

+0

Nota se si dispone di caratteri stranieri, questo verrà convertito in rappresentazione UTF8 di escape, nel qual caso gli utenti potrebbero comunque ottenere nomi di file divertenti a seconda dell'applicazione che apre il file. Ad esempio "Hélo.docx" (che viene visualizzato correttamente dai browser), diventerà "H% C3% A9lo.docx". Ma questo potrebbe essere abbastanza buono in questo caso (e questo è lo stesso con UrlEncode), ma se "user friendly" è un requisito forte, ti suggerisco di controllare anche quello. –

+0

+1 ma, potresti scrivere una breve sintesi di quando usare 'UrlEncode' vs' UrlPathEncode' vs 'EscapeDataString'? –

6

vorrei affrontare in modo diverso: non utilizzare il nome documento come chiave per il tuo look-up - utilizzare un Guid o qualche altro parametro id che è possibile mappare il nome del documento sul disco nel database. Non solo garantirebbe unicità ma non avresti anche questo problema di fuga.

+0

Punto eccellente, ho affrontato tale problema nel mio commento sopra. –

+2

Perché non è possibile utilizzare un'intestazione HTTP 'content-disposition' nella risposta? Questo dovrebbe consentire di impostare il nome del file – BrokenGlass

0

È possibile utilizzare @ carattere per evitare le stringhe. Vedi i seguenti pezzi di codice.

string str = @"\n\n\n\n"; 
Console.WriteLine(str); 

uscita: \ n \ n \ n \ n

string str1 = @"\df\%%^\^\)\t%%"; 
Console.WriteLine(str1); 

uscita: \ df \ %%^\ ^) \ t %%

Questo tipo di formattazione è molto utile per i nomi di percorso e per la creazione di espressioni regolari.

+2

Questo ha a che fare con il parser C#, non con l'applicazione. – BoltClock

Problemi correlati