gpt4 book ai didi

jsf - 如何使用 JSF 2.2 上传文件 ? 保存的文件在哪里?

转载 作者:行者123 更新时间:2023-11-28 23:26:09 25 4
gpt4 key购买 nike

我希望能够在我的 JSF2.2 网络应用程序中上传文件,所以我开始使用新的 <h:inputFile>组件。

我唯一的问题是,如何指定文件在服务器中的保存位置?我想以 java.io.File 的形式获取它们实例。这必须在支持 bean 中实现,但我不清楚如何实现。

最佳答案

JSF 不会将文件保存在任何预定义的位置。它基本上只会以 javax.servlet.http.Part 的形式为您提供上传的文件。在后台临时存储在服务器内存和/或临时磁盘存储位置的实例,您不必担心。

重要的是你需要阅读 Part 尽快 在调用 bean 操作(监听器)方法时。当与 HTTP 请求关联的 HTTP 响应完成时,可以清除临时存储。换句话说,上传的文件不一定在后续请求中可用。

所以,给定一个

<h:form enctype="multipart/form-data">
<h:inputFile value="#{bean.uploadedFile}">
<f:ajax listener="#{bean.upload}" />
</h:inputFile>
</h:form>

您基本上有 2 个选项来保存它:

1。将所有原始文件内容读入 byte[]

您可以使用 InputStream#readAllBytes() 为此。

private Part uploadedFile; // +getter+setter
private String fileName;
private byte[] fileContents;

public void upload() {
fileName = Paths.get(uploadedFile.getSubmittedFileName()).getFileName().toString(); // MSIE fix.

try (InputStream input = uploadedFile.getInputStream()) {
fileContents = input.readAllBytes();
}
catch (IOException e) {
// Show faces message?
}
}

注意 Path#getFileName() .这是关于获取提交的文件名的 MSIE 修复。此浏览器错误地发送了完整的文件路径以及名称,而不仅仅是文件名。

如果您还没有使用 Java 9,因此无法使用 InputStream#readAllBytes() , 然后前往 Convert InputStream to byte array in Java对于所有其他转换方式 InputStreambyte[] .

请记住,上传文件的每个字节都会消耗一个字节的服务器内存。请注意,当用户经常这样做时,您的服务器不会耗尽内存,否则很容易以这种方式滥用您的系统。如果您想避免这种情况,最好使用本地磁盘文件系统上的(临时)文件。

2。或者,写入本地磁盘文件系统

为了保存到想要的位置,需要通过 Part#getInputStream() 获取内容然后 copy它到 Path 代表位置。

private Part uploadedFile; // +getter+setter
private File savedFile;

public void upload() {
String fileName = Paths.get(uploadedFile.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
savedFile = new File(uploads, fileName);

try (InputStream input = file.getInputStream()) {
Files.copy(input, savedFile.toPath());
}
catch (IOException e) {
// Show faces message?
}
}

注意 Path#getFileName() .这是关于获取提交的文件名的 MSIE 修复。此浏览器错误地发送了完整的文件路径以及名称,而不仅仅是文件名。

uploads文件夹和 filename完全在你的控制之下。例如。 "/path/to/uploads" Part#getSubmittedFileName() 分别。请记住,任何现有文件都将被覆盖,您可能需要使用 File#createTempFile() 自动生成文件名。您可以在 this answer 中找到详细示例.

使用 Part#write() 正如某些人可能建议的那样。它基本上会重命名由 @MultipartConfig(location) 标识的临时存储位置中的文件。 .也不要使用ExternalContext#getRealPath()为了将上传的文件保存在部署文件夹中。当重新部署 WAR 时,该文件将丢失,原因很简单,因为该文件不包含在原始 WAR 中。始终将其保存在部署文件夹之外的绝对路径中。

有关上传和预览功能的现场演示,请查看 <o:inputFile> page on OmniFaces showcase 的演示部分.

另见:

关于jsf - 如何使用 JSF 2.2 上传文件 <h :inputFile>? 保存的文件在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36750321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com