| 本教程介绍了如何使用 Sun Java Studio Creator 集成开发环境 (integrated development environment, IDE) 上载并显示图像文件(JPEG、PJPEG、GIF、PNG 或 X-PNG)。教程需要一个具有写入权限的文件夹,作为在文件传送到服务器时的保存位置。另外,教程中还包括一个介绍如何上载文本文件的迷你教程。 |
|
目录
|
![[spacer]](/im/a.gif) |
 |
关于文件上载组件
使用文件上载组件,Web 应用程序用户可以查找其系统上的文件并将该文件上载到服务器。此组件可用于收集文本文件、图像文件和其他数据。已上载文件的内容是与该文件的一些相关信息存储在一起的,这些相关信息包括文件名、大小和 MIME 类型(如纯文本或 jpeg 图像)。
如果上载的文件没有超过 4096 字节,则服务器会将其存放在内存中;否则服务器会将文件内容存放在临时文件中。通过在 Web 应用程序的 web.xml 文件中修改 UploadFilter 过滤器条目的 sizeThreshold 参数,可以更改此阈值。有关修改 web.xml 文件的详细信息,请参见本教程的最后一部分 执行更多操作:修改最大文件上载大小。
如果要保留上载的文件,则可以选用以下三种方法之一:
- 将该文件写入所选位置,如本教程中所示。
- 在受管 Bean 中创建
UploadedFile 属性,并在退出页面之前将其设置为组件的值(类似按钮的 action 方法)。
- 将该文件保存到数据库。
缺省情况下,文件上载组件最多可以处理 1 MB 的文件。通过在应用程序的 web.xml 文件中修改 UploadFilter 过滤器条目的 maxSize 参数,可以更改最大的文件大小,具体操作请参见本教程的最后一部分: 执行更多操作:修改最大文件上载大小。
注意:在 Portlet 中不支持文件上载组件。
创建包括文件上载组件的页面
首先,生成一个表单,用户可以使用该表单选择要上载的文件。
- 创建一个新的 JSF Web 应用程序项目,并将其命名为
FileUploadExample。
图 1 显示了将在以下步骤中创建的页:

图 1:文件上载页面设计 |
- 从组件面板的“基本”类别中将一个“文件上载”组件拖动到页面上。
- 将一个“标签”组件放在文件上载的文本字段的左侧,并将其 text 属性设置为
Choose a File to Upload:。
注意:不要使用文件上载组件的 label 属性。在编写本教程时,该属性有一个错误,会导致组件不起作用。
- 将一个“按钮”组件拖动到页面上,并将其 text 属性设置为
Upload File。将“按钮”组件的 id 属性设置为
uploadFileButton。
- 将一个“标签”组件拖动到页面上,并将其 text 属性设置为
File Name:。
- 将一个“静态文本”组件放置在标签的右侧,并将其
id 属性设置为 fileNameStaticText。
- 将另一对“标签”组件和“静态文本”组件拖动到页面上。将“标签”组件的 text 属性设置为
File Type:,并将“静态文本”组件的 id 属性设置为 fileTypeStaticText。
- 将第三对“标签”组件和“静态文本”组件拖动到页面上。将“标签”组件的 text 属性设置为
File Size:,并将“静态文本”组件的 id 属性设置为 fileSizeStaticText。
- 将一个“图像”组件放置在这些“静态文本”组件下方。
- 将一个“消息组”组件放置在“图像”组件下方。
创建用于接收文件的文件夹
使用文件上载组件的下一步是在项目中创建一个文件夹,用于接收上载的文件。在此示例中,将图像保存到 project-directory\FileUploadExample\web\resources\images 目录。
- 在“项目”窗口中,展开 "FileUploadExample" >“Web 页”。右键单击 "resources" 节点并选择“新建”>“文件夹”。
- 在“文件夹名称”字段中键入
images,然后单击“完成”。
images 文件夹将出现在“项目”窗口中。
添加代码以处理图像上载
现在您已经具有基本的文件上载表单和保存所上载文件的位置,必须添加代码以处理文件上载。
- 双击 Upload File 按钮并将以下代码(以粗体显示)添加到
uploadFileButton_action() 方法中,请注意,代码中含有错误。将在下一步中添加 import 语句来修正这些错误。插入代码后,可以按 Ctrl-Shift-F 组合键重新设置代码格式。
| 代码样例 1:用于上载图像文件的代码 |
public String uploadFileButton_action() {
UploadedFile uploadedFile = fileUpload1.getUploadedFile();
String uploadedFileName = uploadedFile.getOriginalName();
// some browsers return complete path name, some don't
// make sure we only have the file name
String justFileName = uploadedFileName.substring
( uploadedFileName.lastIndexOf(File.separatorChar) + 1 );
this.fileNameStaticText.setValue(justFileName);
Long uploadedFileSize = new Long(uploadedFile.getSize());
this.fileSizeStaticText.setValue(uploadedFileSize);
String uploadedFileType = uploadedFile.getContentType();
this.fileTypeStaticText.setValue(uploadedFileType);
if ( uploadedFileType.equals("image/jpeg")
|| uploadedFileType.equals("image/pjpeg")
|| uploadedFileType.equals("image/gif")
|| uploadedFileType.equals("image/png")
|| uploadedFileType.equals("image/x-png")) {
try {
// get the path to the /resources/images directory
// from the servlet context
ServletContext theApplicationsServletContext =
(ServletContext) this.getExternalContext().getContext();
String realPath =
theApplicationsServletContext.getRealPath
("/resources/images");
File file = new File(realPath + File.separatorChar +
justFileName);
uploadedFile.write(file);
} catch (Exception ex) {
error("Cannot upload file: " + justFileName);
}
} else {
error("You must upload a JPEG, PJPEG, GIF, PNG, or X-PNG file.");
}
return null;
} |
对于每个上载的文件,程序从 UploadedFile 对象提取其名称、类型和大小,并将这些信息绑定到相应的静态文本组件。程序对于所有上载文件作出的一个关键决定是:如果文件是 JPEG、PJPEG、GIF、PNG 或 X-PNG 文件,则程序获取 Servlet 上下文,并将 /web/resources/images 目录映射到服务器上的实际文件系统路径名。如果文件不是有效的图像文件,或者上载文件时出现其他问题,则显示一条错误消息。
- 在 Java 编辑器中单击鼠标右键,然后选择“修复导入”。在“修复导入”对话框中,确保
java.io.File 出现在“全限定名称”字段中,然后单击“确定”。
执行此操作后,以下 import 语句会添加到您的代码中:
| 代码样例 2:Import 语句 |
import com.sun.rave.web.ui.model.UploadedFile; import java.io.File; import javax.servlet.ServletContext;
|
- 在 Java 编辑器左侧的“导航”窗口中,双击
prerender 方法节点,以转至它在 Java 编辑器中的位置。我们需要将以下代码添加到此方法,来检查是否存在要显示的文件:
| 代码样例 3:prerender 方法 |
public void prerender() {
String uploadedFileName = (String)
this.fileNameStaticText.getValue();
if ( uploadedFileName != null ) {
String tmpFile = uploadedFileName.replaceAll(" ", "%20");
image1.setUrl("/resources/images/" + tmpFile);
}
}
|
如果存在要显示的文件,则代码将文件名中的空格替换为 %20 间隔字符,然后将全限定文件名绑定到图像组件。路径 /resources/images/ 是一个上下文相关的 URL。在 URL 前面加上正斜杠,表示通知服务器将 Web 应用程序的位置放在前面以构成完整路径。
测试应用程序
- 运行应用程序。
- 单击“浏览”在本地驱动器中导航,然后选择要上载的文件。图 2 为上载 JPEG 文件后的应用程序。该图像存储在
project-directory\FileUploadExample\build\web\resources\images 中。

图 2:上载图像后的应用程序 |
- 在文件上载组件中输入一个文本文件,然后单击 Upload File 按钮。验证是否显示错误消息。
注意:根据 Web 浏览器的不同,文件上载组件的呈现也会有所不同。请确保在用户要使用的 Web 浏览器中测试此组件。
执行更多操作:上载文本文件
此部分是一个介绍如何上载文本文件的迷你教程。在教程的示例中,使用一个“文本区域”组件显示文件的内容,并使用一个“消息组”组件显示文件的名称和大小。该示例不保存文件的内容。要保存文件的内容,您必须添加将文件保存到磁盘的代码,如上例所示。
- 创建一个新的“JSF Web 应用程序”项目。
- 将一个“文件上载”组件拖动到可视设计器上。
- 添加一个“按钮”组件、一个“文本区域”组件和一个“消息组”组件。
- 双击“按钮”组件并将以下操作代码添加到
button1_action() 方法中:
| 代码样例 4:用于上载文本文件的代码 |
public String button1_action() {
UploadedFile uploadedFile = (UploadedFile)
fileUpload1.getUploadedFile();
info("Uploaded file originally named '" +
uploadedFile.getOriginalName() +
"' of size '" + uploadedFile.getSize() + "'");
textArea1.setText(uploadedFile.getAsString());
return null;
} |
- 按 Alt-Shift-F 组合键以修复导入并自动添加
UploadedFile import 语句。
- 运行应用程序。图 3 显示了一个样例页面。
图 3:上载文本文件 |
执行更多操作:修改最大文件上载大小
要允许上载超过 1 MB 的文件(如大的图像文件、ZIP、JAR 或可执行文件),必须在应用程序的 web.xml 文件中修改 UploadFilter 过滤器的 maxSize 参数。
- 在“文件”窗口中,展开 "<项目名称>" > "Web" > "WEB-INF"。
- 右键单击 web-xml 节点,然后选择“编辑”。
- 在 XML 编辑器中,单击“过滤器”按钮。
- 选择
UploadFilter 的 maxSize 参数,单击“编辑”按钮,然后设置“参数值”。 注意:出于安全考虑,建议您不要将 maxSize 参数设置为负值;如果将其设置为负值,则表示对文件大小没有限制。
- 选择“文件”>“保存”以保存更改。
注意:如果应用程序的用户试图上载大小超过 maxSize 参数值的文件,则会抛出以下异常(您无法在应用程序中捕获到该异常):
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException
另请参见:
此页的最新修改时间:2006 年 1 月 25 日
|