Vaadin 7:文件上传

时间:2013-09-08 12:29:32

标签: vaadin7

我有一个上传组件,我应该导入一个xml文件来解析它。

我正在尝试使用File.createTempFile方法来创建文件,但是有些奇怪的事情正在发生。

例如,如果我使用名为“test.xml”的文件并使用createTempFile方法在磁盘上创建它,则生成文件的名称将变为类似“test.xml13234xml”。如何创建文件正确的方法?

1 个答案:

答案 0 :(得分:2)

当使用ie createTempFile方法时,这是预期的,因为它隐式创建一个带有随机前缀的文件:

// a part of createTempFile method
private static final SecureRandom random = new SecureRandom();
static File generateFile(String prefix, String suffix, File dir) {
    long n = random.nextLong();
    if (n == Long.MIN_VALUE) {
        n = 0;      // corner case
    } else {
        n = Math.abs(n);
    }
    return new File(dir, prefix + Long.toString(n) + suffix);
}

应该提供类似'test.xml13234xml'的内容。

如果要创建具有正确名称的文件并保留以供以后使用,可以在uploadSucceeded方法中重命名/移动它。

public class ExampleUpload implements Upload.Receiver, Upload.SucceededListener {
    private Upload xmlUpload;
    private File tempFile;

    public ExampleUpload() {
        this.xmlUpload = new Upload("Upload:", this);
        this.xmlUpload.addSucceededListener(this);
    }

    @Override
    public OutputStream receiveUpload(String filename, String mimeType) {
        try {
            tempFile = File.createTempFile(filename, "xml");
            tempFile.deleteOnExit();
            return new FileOutputStream(tempFile);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    public void uploadSucceeded(SucceededEvent event) {
        try {
            File destinationFile = new File("c:\\" + event.getFilename());
            FileUtils.moveFile(tempFile, destinationFile));
            // TODO read and parse destinationFile
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}