[Java] Chopper l'encodage d'un nom de fichier

Bon j’ai parcouru le net et stack overflow.

Et rien de probant.

Des clients uploads des fichiers chez nous et du coup, les noms de fichiers peuvent etre chiants.

Comment peut on avoir l’encodage d’un fichier en java simplement ?

Merci

dans ton cas le nom de fichier est encodé selon le protocole que tu utilises pour transmettre. Le contenu, lui, pas sur - si ton protocole balance du byte[] tu ne pourras pas en “deviner” l’encodage s’il n’est pas embarqué dans le format du fichier ou si ce n’est pas un standard de son format.
Il faut savoir à l’avance ou demander a ta source d’envoyer l’encodage avec, via une modif d’API.

Pour compléter la réponse ci-dessus, c’est une bonne pratique de mettre l’encodage dans le fichier lui-même, dans un entête (ASCII lui) comme la première ligne, ou par exemple ce qui se fait en XML.

mouais je rejoins les gars, le Content-Type dans les headers d’envoi serait un gros plus et faciliterait tellement les choses :wink:
C’est au client d’indiquer son typage plus qu’au serveur de le deviner imho.

Encodage du fichier ou du nom du fichier? 

[quote=“GloP, post:5, topic: 55547”][/quote]

Pour l’instant le nom du fichier svp.

Pour le nom du fichier, il ne devrait pas bêtement être dans l’encodage de ton OS?
Si déjà sur l’OS t’as des trucs pas corrects il faut peut-être voir comment et avec quoi tu déposes les fichiers.

[quote=« Bussiere, post:6, topic: 55547 »][/quote]
Tu encapsule le fichier dans un autre fichier qui lui contient l’info (par exemple un ZIP dans lequel il y a le fichier en question, plus un autre fichier « filename-encoding.txt » en ascii qui contient l’encodage du nom du fichier à côté). Mais ça devient usine à gaz :wink:

Le mieux ça reste d’avoir un cahier des charges connu avec ton/tes client(s).

Si tu n’as pas le choix, et que tu ne peux rien changer à la manière dont on t’envoie le fichier, alors il reste l’algo en cascade (crado, mais quand on a pas le choix…). Tu testes les encodings un par un du plus courant au moins courant : ASCII => ah non j’ai un caractère pas bon, alors je teste UTF-8 => ah non plus, alors … etc. et puis si rien ne marche tu sors en erreur.

[quote=“chmop, post:7, topic: 55547”][/quote]
Pareil, je pige pas trop. Les limitations sur les noms de fichier sont portés par l’os non ?

Pas vraiment. Plutôt par l’implémentation du FS pour cet OS. Ca veut dire que si tu as une partition en FAT32 et une partition en Ext3, tu peux peut-être avoir des comportements différents même pour un OS donné.

Au passage, si ça n’est pas ça mais genre un upload par WebService, le plus simple c’est peut-être de regarder l’encoding dans les headers HTTP. Et s’il n’y est pas, de demander au client qui upload de rajouter un header adéquat (ou au pire un header perso genre x-filename-encoding).

Edit :

Mouai après réflexion ça peut être plus tordu. Ca peut être un paramètre de la JVM aussi… Enfin du coup Bussière tu devrais nous donner un peu plus d’infos et un exemple pour qu’on puisse aider.

[quote=“Bussiere, post:6, topic: 55547”][/quote]
je crois que c’est trop tard, c’est ton FTP/webservice qui devrait changer le nom à la volée. Une fois sur le disque, c’est déjà encodé donc perdu.

On a une interface web ou les gens uploadent des fichiers que l’on doit foutre dans des buckets apres.

Le probleme c’est que quand ils uploadent les fichiers c’est un peu la roulette russe au niveau des encodages.

Et du coup comme nous on doit stocker les noms de fichiers on a un peu du mal a bien les avoir…

Tu peux nous envoyer la tête anonymisée du HTTP qui passe en POST sur le formulaire en question ? Dans Chrome, F12, onglet “Network”. Tu remplis le formulaire, tu submit, et tu regarde ce qui est posté.

surtout qu’on ne permet JAMAIS a un client d’uploadé le fichier avec son nom d’origine!
Tu stocke le fichier avec un ID qui renvoie dans une bdd, qui contient le nom d’origine. Ca évite qu’un petit malin d’up un fichier .php et arrive à l’executer.

fichier envoyé: "toto dans la prairie hack ton site oueb.php"
fichier stockés: “20141202.564d23s1ds56d1qs654ds”
(perso je met la date dans le nom du fichier, plus facile de les retrouver/faire le ménage)

merci des reponses je file plus de precisions des que la charette est fine merci en tout cas.

[quote=“nusul, post:14, topic: 55547”][/quote]
énorme +1