我要上傳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 ....
如果你們中的任何人都有一個想法,我會很感激。
這有幾個潛在的缺陷。 1.您必須知道上傳發生的是什麼編碼(不僅是原始文件是什麼,而且是網頁瀏覽器正在上傳的編碼)瀏覽器可能正在告訴服務器它正在以另一種編碼方式上傳文件,如當前文件所示。你能否檢查一下上傳文件的編碼方式? –
如果你可以告訴我如何檢查我會回答你... 但現在我只是不知道如何知道webbrowser發送到服務器的文件的編碼 – Sidewinder94