如何在JSF中保存上传的文件

V.R*_*han 18 jsf file-upload save

我在JSF上传文件.我正在使用Tomahawk <t:inputFileUpload>,但同样的问题适用于例如PrimeFaces <p:fileUpload>和JSF 2.2 <h:inputFile>.

我有以下支持bean代码:

private UploadedFile uploadedFile; // +getter+setter

public String save() throws IOException {
    String name = uploadedFile.getName();
    System.out.println("File name: " + name);

    String type = uploadedFile.getContentType();
    System.out.println("File type: " + type);

    long size = uploadedFile.getSize();
    System.out.println("File size: " + size);  

    InputStream stream = uploadedFile.getInputStream();
    byte[] buffer = new byte[(int) size];  
    stream.read(buffer, 0, (int) size);  
    stream.close();  
}
Run Code Online (Sandbox Code Playgroud)

我能够获取文件名,类型和大小,但我无法将此文件保存在特定路径中.我无法找出保存上传文件的正确方法.我怎样才能做到这一点?

Bal*_*usC 55

getInputStream()上传文件的方法表示文件内容.

InputStream input = uploadedFile.getInputStream();
Run Code Online (Sandbox Code Playgroud)

您需要将其复制到文件中.您应首先在本地磁盘文件系统上准备一个文件夹,以便存储上载的文件.例如,/path/to/uploads(在Windows上,它与服务器运行的磁盘位于同一磁盘上).请注意,您绝对不应该使用相对路径将文件存储在展开的WAR文件夹中,或者getRealPath()出于此处提到的原因,仅在刷新页面后才能使用上载的图像.

然后,您需要自动生成文件名.否则,当其他人稍后上传具有相同名称的文件时,它将被覆盖.您可以使用Files#createTempFile()facility来获取自动生成的文件名.

Path folder = Paths.get("/path/to/uploads");
String filename = FilenameUtils.getBaseName(uploadedFile.getName()); 
String extension = FilenameUtils.getExtension(uploadedFile.getName());
Path file = Files.createTempFile(folder, filename + "-", "." + extension);
Run Code Online (Sandbox Code Playgroud)

如有必要,上传路径可以根据本问答中显示的几种方法之一进行参数化:建议的方法是将上传的文件保存在servlet应用程序中.它FilenameUtils是Apache Commons IO的一部分,您应该已经在类路径中拥有它,因为它是Tomahawk文件上载组件的依赖项.

最后,只需将上传的文件流式传输到该文件(假设是Java 7):

try (InputStream input = uploadedFile.getInputStream()) {
    Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING);
}

System.out.println("Uploaded file successfully saved in " + file);
Run Code Online (Sandbox Code Playgroud)

然后,要将其下载回来,最简单的方法是注册/path/to/uploads为新的webapp上下文或虚拟主机,以便所有这些文件都可通过URL获得.另请参阅使用<h:graphicImage>或<img>标记从webapps/webcontext/deploy文件夹外部加载图像.

  • 使用`<t:inputFileUpload>`生成一个普通的旧HTML4` <input type ="file">`是不可能的.这只适用于Flash或HTML5` <input type ="file"multiple ="true">`.RichFaces和PrimeFaces提供这样的组件.例如http://showcase.richfaces.org/richfaces/component-sample.jsf?demo=fileUpload&skin=blueSky和http://www.primefaces.org/showcase/ui/fileUploadMultiple.jsf (2认同)
  • 只需使用多个`<t:inputFileUpload>`组件或在`<h:dataTable>`或`<t:dataList>`中使用它,由`UploadedFile`集合支持. (2认同)

归档时间:

查看次数:

60828 次

最近记录:

7 年,3 月 前