9
votes

Comment pouvez-vous corriger correctement un nom de document dans .NET?

Nous stockons un groupe de noms de documents étranges sur notre serveur Web (les personnes les téléchargations) disposant de différents caractères tels que des espaces, des ampersands, etc. Lorsque nous générons des liens vers ces documents, nous devons y échapper afin que le serveur puisse les rechercher. le fichier par son nom brut dans la base de données. Cependant, aucune des fonctions intégrées d'évasion .NET ne fonctionnera correctement dans tous les cas.

Prenez le document Hello # là-bas.docx code>: p>

urlencode Code> va gérer cela correctement: p> xxx pré>

Toutefois, urlencode code> pas em> manche bonjour.docx correctement: P>

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


6 commentaires

Comment gérez-vous les DUPS si les utilisateurs téléchargent des fichiers avec le même nom? Ne serait-il pas plus facile de générer les noms (comme un GUID, par exemple) et de stocker le nom sympa, fourni par l'utilisateur, dans la base de données (ainsi que le nom de fichier généré)?


Vous avez probablement besoin de quelque chose comme ça [enlever les caractères illégaux du chemin et des noms de fichiers] [1] [1]: Stackoverflow.com/questions/146134/...


@Kirkwoll - Bonne question :) L'URL en fait ressemble à / docs / 12345 / mon fichier.docx - Le 12345 est une clé unique, mais nous voulons que c'est "sauvegarder Comme "boîte de dialogue pour enregistrer le fichier avec le même nom tel que téléchargé à l'origine. Nous vérifions également que le nom de fichier correspond à la clé d'empêcher les personnes de deviner des documents aléatoires (oui, pas 100% sécurisé mais assez bon) ..


Je ne sais pas si "l'URL coding" serait plus approprié que "Escape" ici car c'est précisément ce que vous recherchez. Ensuite, cela pourrait créer une confusion avec la méthode urlencode () que vous mentionnez.


@Mikechristensen: Cela devrait fonctionner simplement bien à l'aide d'un Disposition de contenu HTTP-Rubrique avec pièce jointe; nom_file = mon fichier.docx


@Brokenglass - Yea, nous définissons également ces en-têtes de réponse HTTP, mais je pense qu'il y avait des cas, cela ne fonctionnait pas comme nous le voulions. Je peux vous tromper avec cet itinéraire un peu plus, mais je préfère également les URL plus amies que cela est possible.


3 Réponses :


15
votes

2 commentaires

Remarque Si vous avez des caractères étrangers, cela le convertira en tant que représentation de UTF8 échappée, auquel cas vos utilisateurs peuvent toujours obtenir des noms de fichiers amusants en fonction de l'application qui ouvre le fichier. Par exemple, "hélo.docx" (Wich est affiché correctement par navigateur), deviendra "H% C3% A9LO.DOCX". Mais cela peut être assez bien dans ce cas (et le BTW, c'est la même chose avec UrlenCode), mais si "Utilisateur" est une forte exigence, je vous suggère de vérifier cela aussi.


+1 Mais, pourriez-vous écrire un synopsis rapide de quand utiliser urlencode vs urlpathenCode vs échappement ?



6
votes

Je m'approcherais d'une manière différente: N'utilisez pas le nom Nom du document comme clé de votre recherche - utilisez un GUID ou un autre paramètre d'identifiant que vous pouvez mapper sur le nom du document sur le disque. dans votre base de données . Non seulement cela garantirait que la garantie de l'unicité, mais vous n'auriez pas non plus ce problème de s'échapper en premier lieu.


1 commentaires

Pourquoi ne pouvez-vous pas utiliser un Disposition de contenu HTTP dans votre réponse? Cela devrait vous permettre de définir le nom du fichier



0
votes

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

sortie: \ n \ n \ n \ n xxx

sortie: \ df \ %% ^ \ ^) \ t% %

Ce type de formatage est très utile pour les noms de chemin et pour créer des regexes.


1 commentaires

Cela a à voir avec l'analyseur C #, pas l'application.