如何在jsf和PrimeFaces中上传和阅读文本文件?

时间:2013-09-04 09:18:49

标签: java jsf file-upload primefaces readfile

我需要使用PrimeFaces和jsf上传和读取文本文件。我的问题是,当我上传文本文件时,它存储在哪里?这是我的.xhtml和java类:

<h:form enctype="multipart/form-data">

<p:messages showDetail="true" />

    <p:fileUpload value="#{send.file }" mode="simple" />
    </h:form>
    <p:commandButton actionListener="#{send.upload}"  value="Send" ajax="false" />

     //Send.java

     private UploadedFile file;

     public void upload() {  
    if(file != null) {  
        FacesMessage msg = new FacesMessage("Succesful", file.getFileName() + " is uploaded.");  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }

我也发现这个例子来读取文件:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {

    public static void main(String[] args) {

        try (BufferedReader br = new BufferedReader(new FileReader("C:\\testing.txt")))
        {
            String sCurrentLine;

            while ((sCurrentLine = br.readLine()) != null) {
                System.out.println(sCurrentLine);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我的另一个问题是在这个例子中“C:​​\ testing.txt”是作为路径给出的吗?我必须提供哪个地址才能阅读我上传的文件?

3 个答案:

答案 0 :(得分:3)

  

当我上传文本文件时,它存储在哪里?

这实际上不属于您的业务,您不应该从JSF支持bean代码中对此感兴趣。它(部分)存储在服务器的临时存储位置中(部分)存储在服务器的临时存储位置,每隔一段时间擦除/清理一次。它绝对不是永久存储位置。您应该在action / listener方法中只读取上传的文件内容并将其存储在您选择的永久存储位置。

E.g。

private static final File LOCATION = new File("/path/to/all/uploads");

public void upload() throws IOException {
    if (file != null) {
        String prefix = FilenameUtils.getBaseName(file.getName()); 
        String suffix = FilenameUtils.getExtension(file.getName());
        File save = File.createTempFile(prefix + "-", "." + suffix, LOCATION);
        Files.write(save.toPath(), file.getContents());
        // Add success message here.
    }
}

请注意,FilenameUtils是您应该已安装的Apache Commons IO的一部分,因为它是<p:fileUpload>的必需依赖项。另请注意,File#createTempFile()在上面的示例中并没有完全生成临时文件,但它只是用于生成唯一的文件名。否则,当其他人巧合地上传与现有文件名称完全相同的文件时,它将被覆盖。另请注意,Files#write()是Java 7的一部分。如果您仍处于Java 6或更早版本,请改为使用Apache Commons IO IOUtils

答案 1 :(得分:0)

请查看与此问题相关的此主题: how to upload file to http remote server using java?

如果它对您没有帮助,请告诉我,我会通过。 ;)

答案 2 :(得分:0)

我以这种方式重写文件

private UploadedFile file;

public void upload() {
    if (file != null && !"".equals(file.getFileName())) {
        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(file.getInputstream(), "UTF-8"))) {
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }

        } catch (Exception ex) {
            LOG.error("Error uploading the file", ex);
        }
    }
}