Encoding reponse

cancel
Showing results for 
Search instead for 
Did you mean: 
viscere
Member II

Encoding reponse

Bonjour,

J'ai écris un webscript (ALFRESCO 3.2) qui exporte une liste de noeuds dans un fichier csv.

J'ai du implémenter le fichier csv comme une extension dans mon jscript-context.xml :

<bean parent="webscripts.formatmap">
      <property name="formats">
            <props>
                  <prop key="csv">application/vnd.ms-excel</prop>
            </props>
      </property>
</bean>

description du script :
<webscript>
      <shortname>CSV Export</shortname>
      <description>CSV Export</description>
      <url>/myApp/export</url>
      <format default="csv">extension</format>
      <authentication>user</authentication>
      <transaction>required</transaction>
</webscript>

Mon .js est une simple recherche lucene, et le .csv.ftl ressemble à ceci :
<#list folders as folder>"${folder.name}";"${folder.properties.description!’’}
</#list>

Mon problème viens lors de l'ouverture du fichier dans excel, tous les accents ne s'affichent pas.

Si je sauvegarde le csv comme un fichier, puis que je l'ouvre avec l'éditeur de texte, il est reconnu comme “UTF-8 without BOM”. Puis lorsque je le convertis en"UTF-8", les accents apparaissent désormais dans excel.

Comment puis-je faire sans passer par la conversion manuelle?

Merci d'avance,

Laurent
1 Reply
bertrandf
Active Member

Re: Encoding reponse

Je ne pense pas qu'il soit possible de définir l'encodage dans un webscript "simple", cependant cela doit surement être possible avec un webscript en Java.

Je pense notamment à un Webscript de type AbstractWebScript, il est possible de définir l'encodage en sortie, le content-type, le nom du fichier :
res.setHeader("Content-disposition", "attachment; filename=monfichier.csv");
res.setContentType("text/csv");
res.setContentEncoding("UTF-8");


J'ai testé rapidement mais ce n'est pas concluant, je met le code tout de même, ca peut toutjours servir à qqn :
Librairie CSV utilisée : http://sourceforge.net/projects/javacsv/
package com.atolcd.web.scripts;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.List;

import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.namespace.NamespaceService;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.extensions.webscripts.AbstractWebScript;
import org.springframework.extensions.webscripts.WebScriptRequest;
import org.springframework.extensions.webscripts.WebScriptResponse;
import org.springframework.util.Assert;

import com.csvreader.CsvWriter;

public class ExportCSV extends AbstractWebScript implements InitializingBean {
   public final static char separator = ';';

   private NodeService nodeService;
   private SearchService searchService;
   private NamespaceService namespaceService;

   public void setNodeService(NodeService nodeService) {
      this.nodeService = nodeService;
   }

   public void setSearchService(SearchService searchService) {
      this.searchService = searchService;
   }
   
   public void setNamespaceService(NamespaceService namespaceService) {
      this.namespaceService = namespaceService;
   }

   public void afterPropertiesSet() throws Exception {
      Assert.notNull(nodeService);
      Assert.notNull(searchService);
      Assert.notNull(namespaceService);
   }

   public void execute(WebScriptRequest req, WebScriptResponse res)
         throws IOException {
      // Create an CSV Object
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      CsvWriter csv = new CsvWriter(baos, separator, Charset.forName("UTF-8"));

      try {
         // Write into the CSV Object
         csv.writeRecord(new String[] { "Nom", "Description" });

         List<NodeRef> nodes = searchService.query(new StoreRef("workspace", "SpacesStore"), SearchService.LANGUAGE_LUCENE, "+TYPE:\""
               + ContentModel.TYPE_FOLDER.toPrefixString(namespaceService) + "\"").getNodeRefs();
         
         for (NodeRef node : nodes) {
            String[] tab = new String[] {
               (String) nodeService.getProperty(node, ContentModel.PROP_NAME),
               (String) nodeService.getProperty(node, ContentModel.PROP_DESCRIPTION)
            };
            csv.writeRecord(tab);
         }
      } catch (IOException e) {
         System.err.println(e.getMessage());
      }

      // Close the CSV Object
      csv.close();

      // Send the file into the WS getOutputStream
      res.setHeader("Content-disposition", "attachment; filename=monfichier.csv");
      res.setHeader("Content-Type", "text/csv; charset=utf-8");
      // res.setHeader("Accept-Charset", "utf-8");
      // res.setHeader("Content-Length", Long.toString(baos.size()));
      res.setContentType("text/csv");
      res.setContentEncoding("UTF-8");

      baos.writeTo(res.getOutputStream());
   }
}