2017-06-03 1 views
0

Sur une machine Linux (openSUSE) j'essaye de déployer sur l'application Tomcat 8 (fichier war) qui contient un fichier avec des noms avec des caractères Unicode.Tomcat 8 Unicode nom de fichier de guerre déployer problème

A l'intérieur du fichier de guerre le nom ressemble à:

бжк-природний-1496336830201.xml 

mais déployer après que le fichier ressemble à:

???-?????????????-1496336830201.xml 

Comment dire Tomcat pour déployer correctement les noms de fichiers?

MISE À JOUR

Ce fichier de guerre exemple avec le nom de fichier Unicode dans: war file

Quel est le problème avec le nom de fichier du fichier à l'intérieur dans cette guerre?

MISE À JOUR

J'ai installé unzip-rcc comme il a été suggéré ici et maintenant https://superuser.com/questions/1215670/opensuse-unzip-unicode-issue décompressez le fichier WAR (commande de la console) fonctionne très bien, mais Tomcat déployer encore les fichiers avec le même problème.

+0

Si vous décompressez la guerre dans un répertoire, ne le nom du fichier avec des caractères spéciaux conservés? Une autre chose à faire est de s'assurer que JAVA a le bon encodage. –

+0

ouais .. unzip tue les noms de fichiers – alexanoid

+0

Cela suggère que le système d'exploitation n'a pas la police ou le jeu de caractères pour gérer un tel encodage. Donc, ce n'est pas la faute de Java :) –

Répondre

2

Essayez de mettre ces paramètres dans le script de démarrage Tomcat:

export LC_ALL=en_US.UTF-8 
export LANG=en_US.UTF-8 
export LANGUAGE=en_US.UTF-8 

De l'expérience, Java imprimer jusqu'à côté vers le bas point d'interrogation pour les personnages, il ne sait pas comment coder.

+0

Merci beaucoup! J'ai lutté avec ce problème pendant quelques jours et maintenant avec votre aide, il est résolu! J'ai ajouté ces propriétés à mon fichier tomcat.conf – alexanoid

2

Le nom de fichier est en effet en UTF-8 dans le fichier zip .war.

try (ZipFile zipFile = new ZipFile(path, StandardCharsets.UTF_8)) { 
    zipFile.stream() 
     .forEachOrdered(entry -> System.out.printf("- %s%n", entry.getName())); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Cependant, le zip n'a ajouté l'encodage (comme bytes[] extra informations).

Trois solutions seraient imaginables:

  • Une solution à court peut-être exécuter TomCat une locale UTF-8. Le mieux serait que maven construise une guerre avec l'encodage UTF-8. (<onfiguration><encoding>UTF-8</encoding></configuration>)
  • Réparer la guerre en la convertissant.

Avec les deux premières solutions, je n'ai aucune expérience. Une recherche rapide n'a rien donné ("encoder" est un peu omniprésent).

Le code de réparation est simple:

Path path = Paths.get(".../api.war").toAbsolutePath().normalize(); 
Path path2 = Paths.get(".../api2.war").toAbsolutePath().normalize(); 

URI uri = URI.create("jar:file://" + path.toString()); 
Map<String,String> env = new HashMap<String,String>(); 
env.put("create", "false"); 
env.put("encoding", "UTF-8"); 

URI uri2 = URI.create("jar:file://" + path2.toString()); 
Map<String,String> env2 = new HashMap<String,String>(); 
env2.put("create", "true"); 
env2.put("encoding", "UTF-8"); 

try (FileSystem zipFS = FileSystems.newFileSystem(uri, env); 
    FileSystem zipFS2 = FileSystems.newFileSystem(uri2, env2)) { 

    Files.walkFileTree(zipFS.getPath("/"), new SimpleFileVisitor<Path>() { 
     @Override 
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
        throws IOException { 
      System.out.println("* File: " + file); 
      Path file2 = zipFS2.getPath(file.toString()); 
      Files.createDirectories(file2.getParent()); 
      Files.copy(file, file2); 
      return FileVisitResult.CONTINUE; 
     } 
    }); 

} catch(IOException e) { 
    e.printStackTrace(); 
}