- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望能够在我的 JSF2.2 Web 应用程序中上传文件,所以我开始使用新的 <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 个选项可以保存它:
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 修复。此浏览器错误地沿名称发送完整的文件路径,而不是仅发送文件名。
InputStream#readAllBytes()
,然后前往
Convert InputStream to byte array in Java对于所有其他转换方式
InputStream
至
byte[]
.
Part#getInputStream()
获取内容然后
copy到
Path
代表位置。您可以以通常的方式在(ajax)操作(监听器)方法中执行此操作。这是一个在 HTML DOM 期间使用 ajax 监听器执行此操作的示例
change
事件:
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()
自动生成文件名。
Part#write()
正如某些prople可能建议的那样。它基本上会重命名由
@MultipartConfig(location)
标识的临时存储位置中的文件。 .也做
不是 使用
ExternalContext#getRealPath()
为了将上传的文件保存在部署文件夹中。重新部署 WAR 时,该文件将丢失,原因很简单,原始 WAR 中不包含该文件。始终将其保存在部署文件夹之外的绝对路径中。
<o:graphicImage>
demo on OmniFaces showcase 的最后一项.
关于jsf - 如何使用 JSF 2.2 上传文件 <h :inputFile>? 保存的文件在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27677397/
有没有办法只获取浏览文件的内容而不进行任何上传/文件传输操作?我目前使用 ICEFaces inputFile 组件,但不需要文件的默认上传操作。谢谢。 最佳答案 这是不可能的。每当服务器端想要获取文
我的 JSF View 使用普通 上传文件.一旦选择文件(onchange 事件),它就有一个 AJAX Action 开始上传。我想对文件做一些基本的验证,使用 HTML5 DOM File AP
我在 dotnet 5 上有一个 Blazor Web Assembly 应用程序。我已将 Microsoft.AspNetCore.Components.Forms.InputFile 控件添加到组
我正在使用 Xcode 6.2 (6C131e) 构建我的 cocoa 项目。它工作得非常顺利,但今天我遇到了以下错误: 2015-06-01 11:53:59.911 xcodebuild[2060
我有一个名为 myfile 的 HTML5 输入文件。在同一个文件中,我在一段 JavaScript 中使用了 $("#myfile").click();。 $("#myfile").click();
我在 jdeveloper 中使用 adf。我有一个 af:inputfile,它使用 valuechangelistener 检查文件类型,然后上传到服务器。 我需要在这些过程发生时显示弹出窗口(带
我正在使用 inputFile 按钮上传一些文件... 该按钮在我的页面上呈现为灰色的“选择要上传的文件”按钮。我可以添加自己的自定义图标/图像来代替按钮吗? 最佳答案 是的,你可以做到。虽然,这不是
我有一个使用 Blazor InputFile 组件作为子组件的组件。 当我选择一个文件时,按预期调用 OnChange 处理程序。但是,如果我两次选择同一个文件,则不会再次调用 OnChange 处
我需要执行一个 powershell 脚本来执行 SQL 脚本来创建数据库。根据我的知识,我以这种方式执行 powershell 命令: Init.ps1 $DATABASEFILENAME = "C
请告诉我 InputFile.PostedFile.ContentLength 测量的单位。我需要确保文件小于 500k。 谢谢。 最佳答案 测量单位 = 字节。 1 Kilobyte (kB) =
我的 ADF 表单工作正常,除了一个奇怪的缓存问题。我有一个不使用数据库的 ADF 表单。它有一个输入文件字段,用户可以选择电子表格。当他们单击“处理文件”按钮时,它会读取电子表格,进行一些数据操作并
我正在使用 OmniFaces's 2.6.1 inputFile上传文件并希望通过使用 accept 属性应用媒体类型过滤,例如 accept="image/png"。这适用于具有 .png 扩展名
我想使用Process process = new ProcessBuilder("executable.exe", "InputFile").start()来运行executable.exe。运行该
我正在使用 Krajee Bootstrap FileInput。我正在使用 initialPreview 标签并遇到以下问题: 初始图像以原始图像大小而非缩略图大小显示 无法删除初始图像。 我使用了
This question already has answers here: Fileupload and PrettyFaces and JSF 2.2 [duplicate] (2个答案) 5年
我需要能够提取完整的文件名,包括用户使用我的 InputFile 元素选择文件时的路径。 因此,举个例子,使用这个 我可以像这样在事件处理程序中看到文件名 void FileSelected(Inp
我在 jsff 页面中使用 inputFile 组件,用户可以在其中浏览文件系统,选择文件以便将其存储在数据库中。 我为此组件创建了一个 ValueChangeListener 方法,用于处理该文件并
谁能告诉我如何在 Oracel ADF 中使用 af:inputFile 将文件上传到服务器。我对此进行了搜索,发现我们可以使用以下内容 使用上面的代码,我可以设置一个方法,当有人在表单中选
创建一个 UI InputField 组件,并将线型选择为 Singleline。 构建游戏并将其安装到 IOS 设备(例如 iPhone)。 将键盘设置为快速拨号类型和中文拼音输入。 打开游戏,输入
ifstream inputFile; inputFile.open(argv[1]); char* buffer[40]; inputFile >> buffer; 我也试过 输入文件 >> *缓冲
我是一名优秀的程序员,十分优秀!