Comment échapper correctement à un nom de document dans .NET?

Nous stockons une foule de noms de documents étranges sur notre serveur Web (les personnes les téléchargent) contenant divers caractères, tels que des espaces, des esperluettes, etc. Lorsque nous générons des liens vers ces documents, nous devons les échapper pour que le serveur puisse rechercher le fichier par son nom brut dans la firebase database. Cependant, aucune des fonctions d’échappement .NET intégrées ne fonctionnera correctement dans tous les cas.

Prenez le document Hello#There.docx :

UrlEncode va gérer cela correctement:

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

Cependant, UrlEncode ne gérera pas Hello There.docx correctement:

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

Le symbole + n’est valide que pour les parameters d’URL, pas pour les noms de document. Fait intéressant, cela fonctionne réellement sur le serveur Web de test Visual Studio, mais pas sur IIS.

La fonction UrlPathEncode fonctionne UrlPathEncode pour les espaces:

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

Cependant, il n’échappera pas à d’autres caractères tels que le caractère # :

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

Ce lien n’est pas valide car le # est interprété comme un hachage d’URL et n’atteint jamais le serveur.

Existe-t-il une méthode utilitaire .NET permettant d’échapper à tous les caractères non alphanumériques d’un nom de document ou devrais-je écrire le mien?

Jetez un coup d’œil à la méthode Uri.EscapeDataSsortingng :

 Uri.EscapeDataSsortingng("Hello There.docx") // "Hello%20There.docx" Uri.EscapeDataSsortingng("Hello#There.docx") // "Hello%23There.docx" 

J’aborderais les choses différemment: n’utilisez pas le nom du document comme clé dans votre recherche. Utilisez un paramètre Guid ou un autre paramètre id que vous pouvez mapper sur le nom du document sur disque dans votre firebase database . Non seulement cela garantirait l’unicité, mais vous n’auriez pas non plus ce problème de vous échapper.

Vous pouvez utiliser le caractère @ pour échapper aux chaînes. Voir les morceaux de code ci-dessous.

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

Sortie: \ n \ n \ n \ n

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

Sortie: \ df \ %% ^ \ ^) \ t %%

Ce type de formatage est très utile pour les noms de chemins et pour la création de regex.