为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Helenr 2019-07-03 17:10:38
如何在JSF中保存上传的文件我正在JSF中上传一个文件。我用的是战斧<t:inputFileUpload>对于这一点,但同样的问题适用于例如PrimeFaces<p:fileUpload>和JSF 2.2<h:inputFile>.我有以下支持bean代码:private UploadedFile uploadedFile; // +getter+setterpublic 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();  }我能够获得文件名、类型和大小,但无法将该文件保存在特定路径上。我想不出保存上传文件的正确方法。我怎样才能做到这一点?
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

这个getInputStream()方法表示文件内容。

InputStream input = uploadedFile.getInputStream();

你需要把它复制到一个文件中。首先,应在本地磁盘文件系统上准备一个文件夹,将上传的文件存储在该文件夹中。例如,/path/to/uploads(在Windows上,这将与服务器运行的磁盘相同)。注意你应该绝对不是使用相对路径或getRealPath()基于这里提到的原因上传的图像只有在刷新页面后才可用.

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

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);

如果有必要,上传路径可以根据以下问答中所示的几种方式之一进行参数化:推荐在servlet应用程序中保存上传的文件的方法..这个FilenameUtils是ApacheCommonsIO的一部分,因为它是Tomahawk文件上载组件的依赖项,所以您应该在类路径中拥有它。

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

try (InputStream input = uploadedFile.getInputStream()) {
    Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING);}System.out.println("Uploaded file successfully saved in " + file);

然后,要下载回来,最简单的方法就是注册。/path/to/uploads作为一个新的webapp上下文或虚拟主机,这样所有这些文件都可以通过URL获得。另见使用<h:GraphicImage>或<img>标记从webapp/webtext/Deploy文件夹外部加载图像.


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 523 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信