2013-07-05 164 views
0

我要上传ANSI文件(ISO-8859-1)的ANSI文件时,正确编码流,它包含的字符,如(E,E,A,E,和别的)。如何上传有与Vaadin上传组件

在一个虚拟的项目中,我写了这个:

package com.mic; 

import com.vaadin.cdi.CDIUI; 
import com.vaadin.data.util.IndexedContainer; 
import com.vaadin.server.FileDownloader; 
import com.vaadin.server.StreamResource; 
import com.vaadin.server.VaadinRequest; 
import com.vaadin.ui.AbstractSelect; 
import com.vaadin.ui.ComboBox; 
import com.vaadin.ui.UI; 
import com.vaadin.ui.Upload; 
import com.vaadin.ui.VerticalLayout; 
import java.io.*; 

/** 
* 
* @author stagiaire 
*/ 
@CDIUI 
public class TestCDIUI extends UI { 



    @Override 
    protected void init(VaadinRequest request) 
    { 
     VerticalLayout verticalLayout = new VerticalLayout(); 
     Upload upload = new Upload("Merci de sélectionner le fichier à importer", null); 
     upload.setButtonCaption("Importer"); 
     verticalLayout.addComponent(upload); 
     FileUploader uploader = new FileUploader(); 
     upload.setReceiver(uploader); 
     upload.addSucceededListener(uploader); 
     setContent(verticalLayout); 

    } 
} 

和类FileUploader是下列之一:

package com.mic; 

import com.vaadin.ui.Upload; 
import java.io.BufferedReader; 
import java.io.ByteArrayOutputStream; 
import java.io.OutputStream; 
import java.io.StringReader; 

class FileUploader implements Upload.Receiver, Upload.SucceededListener 
    { 
     private OutputStream os;  
     @Override 
     public OutputStream receiveUpload(String filename, String mimeType) { 

      this.os = new ByteArrayOutputStream(); 
      return this.os;//On retourne le flux dans lequel le controle ecrira le contenu du fichier uploadé 
     } 

     @Override 
     public void uploadSucceeded(Upload.SucceededEvent event) 
     { 
      System.out.println(this.getStringContent()); 

     } 

     public String getStringContent() 
     { 
      return this.os.toString(); 
     } 

     public BufferedReader getReader() 
     { 
      return new BufferedReader(new StringReader(this.getStringContent())); 
     } 

    } 

有了这样的代码,我有这样的输出:

P�dago;Ann�e;Mois;Semaine;Nb jours;Date;Matin/Apr�s-midi;Heures;Code analytique;Intitul� des modules;Intervenants;Hono pr�visionnels;Partage (coef.);Nb salles;Ann�e apprentissage;CA 
;2011;4;17;0,5j;22/04/2011;1;4h;NT1N2143;Revision .NET;MCY;0;1;1;;0 
;2011;4;17;0,5j;22/04/2011;1;4h;NT1N2143;Revision .NET;MCY;0;1;1;;0 
;2012;7;;0,5j;25/07/2012;1;4h;NT1N2143;Revision .NET;OBER;300;1;1;;300 
;2012;7;;0,5j;27/07/2012;2;4h;NT1N2143;Revision .NET;AGUESSE;250;1;1;;250 
;2013;6;;0,5j;15/06/2013;1;4h;NT1N2143;Revision .NET;VALL;200;1;1;;200 
;2013;6;;0,5j;15/06/2013;2;4h;NT1N2143;Revision .NET;VALL;500;1;1;;500 

但什么是上传的文件是:

Pédago;Année;Mois;Semaine;Nb jours;Date;Matin/Après-midi;Heures;Code analytique;Intitulé des modules;Intervenants;Hono prévisionnels;Partage (coef.);Nb salles;Année apprentissage;CA 
;2011;4;17;0,5j;22/04/2011;1;4h;NT1N2143;Revision .NET;MCY;0;1;1;;0 
;2011;4;17;0,5j;22/04/2011;1;4h;NT1N2143;Revision .NET;MCY;0;1;1;;0 
;2012;7;;0,5j;25/07/2012;1;4h;NT1N2143;Revision .NET;OBER;300;1;1;;300 
;2012;7;;0,5j;27/07/2012;2;4h;NT1N2143;Revision .NET;AGUESSE;250;1;1;;250 
;2013;6;;0,5j;15/06/2013;1;4h;NT1N2143;Revision .NET;VALL;200;1;1;;200 
;2013;6;;0,5j;15/06/2013;2;4h;NT1N2143;Revision .NET;VALL;500;1;1;;500 

上传的文件在ISO-8859-1被编码并产生上述的输出。 当我手动将其转换为UTF-8编码文件时,没有问题,我有一个正确的输出。 问题是:文件是由Excel生成的,我无法更改编码。

我已经搜索了vaadin书/ API并没有发现线索。

也试过这样的uploadSuceeded方法:

public void uploadSucceeded(Upload.SucceededEvent event) 
     { 
      try 
      { 
       OutputStream out = new ByteArrayOutputStream(); 
       OutputStreamWriter osw = new OutputStreamWriter(out, "8859_1"); 
       osw.write(getStringContent()); 
       osw.close(); 
       System.out.println(out.toString()); 
      } 
      catch (Exception e) 
      { 
       System.out.println(e); 
      } 


     } 

而且这是新的输出:

P?dago;Ann?e;Mois;Semaine;Nb jours;Date;Matin/Apr?s-midi;Heures;Code analytique;Intitul? des modules;Intervenants;Hono pr?visionnels;Partage (coef.);Nb salles;Ann?e apprentissage;CA 
;2011;4;17;0,5j;22/04/2011;1;4h;NT1N2143;Revision .NET;MCY;0;1;1;;0 
;2011;4;17;0,5j;22/04/2011;1;4h;NT1N2143;Revision .NET;MCY;0;1;1;;0 
;2012;7;;0,5j;25/07/2012;1;4h;NT1N2143;Revision .NET;OBER;300;1;1;;300 
;2012;7;;0,5j;27/07/2012;2;4h;NT1N2143;Revision .NET;AGUESSE;250;1;1;;250 
;2013;6;;0,5j;15/06/2013;1;4h;NT1N2143;Revision .NET;VALL;200;1;1;;200 
;2013;6;;0,5j;15/06/2013;2;4h;NT1N2143;Revision .NET;VALL;500;1;1;;500 

所以这是不是一个真正的sucess ....

如果你们中的任何人都有一个想法,我会很感激。

+0

这有几个潜在的缺陷。 1.您必须知道上传发生的是什么编码(不仅是原始文件是什么,而且是网页浏览器正在上传的编码)浏览器可能正在告诉服务器它正在以另一种编码方式上传文件,如当前文件所示。你能否检查一下上传文件的编码方式? –

+0

如果你可以告诉我如何检查我会回答你... 但现在我只是不知道如何知道webbrowser发送到服务器的文件的编码 – Sidewinder94

回答

1

找到解决方案 Vaadin的上传组件正在写入FileUploader类的recieveUpload方法中提供的ouputStream中。

上传的文件在这一点不会改变。这意味着我们只需要让java明白它必须使用latin-1/9字符集读取Stream。因为如果没有他不知道哪个编码,而使用默认的字符集平台:UTF-8(对我来说)

这样做是在uploadSucceeded方法这样做:

public void uploadSucceeded(Upload.SucceededEvent event) 
     { 
      try 
      { 
       OutputStream out = new ByteArrayOutputStream(); 
       out.write(getStringContent().getBytes(Charset.forName("8859_1"))); 
       out.close(); 
       System.out.println(out.toString()); 
      } 
      catch (Exception e) 
      { 
       System.out.println(e); 
      } 


     } 

这里,我们正在创建中,我们正在编写包含在原始流

字符串的LATIN1/9编码版本的新的数据流,并显示该流时......都没有问题,我们有一个正确的输出。

希望这会有所帮助