【问题标题】:How to have a properly encoded Stream when uploading an ANSI file with Vaadin Upload component使用 Vaadin 上传组件上传 ANSI 文件时如何获得正确编码的流
【发布时间】:2013-07-05 13:38:55
【问题描述】:

我想上传一个 ANSI 文件 (ISO-8859-1),它包含诸如(é、è、à、ê 等)之类的字符。

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

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 Book/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

所以这并不是真正的成功......

如果有人对此有任何想法,我将不胜感激。

【问题讨论】:

  • 这有几个潜在的陷阱。 1.您必须知道上传发生的编码是什么(不仅是原始文件是什么,而且浏览器正在上传它的编码是什么)可能浏览器正在告诉服务器它正在以另一种编码方式上传文件当前是。你能检查一下上传使用的是什么编码吗?
  • 如果你能告诉我如何检查我会回答你......但现在我只是不知道如何知道网络浏览器发送到服务器的文件的编码

标签: jakarta-ee encoding vaadin


【解决方案1】:

找到解决方案 Vaadin 的 Upload 组件写入 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 编码版本

当显示这个流时……完全没有问题,我们有一个正确的输出。

希望这会有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    相关资源
    最近更新 更多