2013-07-05 160 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編碼版本的新的數據流,並顯示該流時......都沒有問題,我們有一個正確的輸出。

希望這會有所幫助