» 搜索提示 
 
使用文件上载组件
2006 年 1 月 [修订号:V2-2]  
本教程介绍了如何使用 Sun Java Studio Creator 集成开发环境 (integrated development environment, IDE) 上载并显示图像文件(JPEG、PJPEG、GIF、PNG 或 X-PNG)。教程需要一个具有写入权限的文件夹,作为在文件传送到服务器时的保存位置。另外,教程中还包括一个介绍如何上载文本文件的迷你教程。
 
目录
 
关于文件上载组件
创建包括文件上载组件的页面
创建用于接收文件的文件夹
添加代码以处理图像上载
测试应用程序
执行更多操作:上载文本文件
执行更多操作:修改最大文件上载大小
[spacer] 此页上的内容适用于 Sun Java Studio Creator 2
 

关于文件上载组件

 
使用文件上载组件,Web 应用程序用户可以查找其系统上的文件并将该文件上载到服务器。此组件可用于收集文本文件、图像文件和其他数据。已上载文件的内容是与该文件的一些相关信息存储在一起的,这些相关信息包括文件名、大小和 MIME 类型(如纯文本或 jpeg 图像)。
 
如果上载的文件没有超过 4096 字节,则服务器会将其存放在内存中;否则服务器会将文件内容存放在临时文件中。通过在 Web 应用程序的 web.xml 文件中修改 UploadFilter 过滤器条目的 sizeThreshold 参数,可以更改此阈值。有关修改 web.xml 文件的详细信息,请参见本教程的最后一部分执行更多操作:修改最大文件上载大小
 
如果要保留上载的文件,则可以选用以下三种方法之一:
  • 将该文件写入所选位置,如本教程中所示。
  • 在受管 Bean 中创建 UploadedFile 属性,并在退出页面之前将其设置为组件的值(类似按钮的 action 方法)。
  • 将该文件保存到数据库。
 
缺省情况下,文件上载组件最多可以处理 1 MB 的文件。通过在应用程序的 web.xml 文件中修改 UploadFilter 过滤器条目的 maxSize 参数,可以更改最大的文件大小,具体操作请参见本教程的最后一部分:执行更多操作:修改最大文件上载大小
 
注意:在 Portlet 中不支持文件上载组件。
 

创建包括文件上载组件的页面

 
首先,生成一个表单,用户可以使用该表单选择要上载的文件。
  1. 创建一个新的 JSF Web 应用程序项目,并将其命名为 FileUploadExample

    图 1 显示了将在以下步骤中创建的页:

    图 1:文件上载页面设计
    图 1:文件上载页面设计


  2. 从组件面板的“基本”类别中将一个“文件上载”组件拖动到页面上。

  3. 将一个“标签”组件放在文件上载的文本字段的左侧,并将其 text 属性设置为 Choose a File to Upload:

    注意:不要使用文件上载组件的 label 属性。在编写本教程时,该属性有一个错误,会导致组件不起作用。

  4. 将一个“按钮”组件拖动到页面上,并将其 text 属性设置为 Upload File。将“按钮”组件的 id 属性设置为 uploadFileButton

  5. 将一个“标签”组件拖动到页面上,并将其 text 属性设置为 File Name:

  6. 将一个“静态文本”组件放置在标签的右侧,并将其 id 属性设置为 fileNameStaticText

  7. 将另一对“标签”组件和“静态文本”组件拖动到页面上。将“标签”组件的 text 属性设置为 File Type:,并将“静态文本”组件的 id 属性设置为 fileTypeStaticText

  8. 将第三对“标签”组件和“静态文本”组件拖动到页面上。将“标签”组件的 text 属性设置为 File Size:,并将“静态文本”组件的 id 属性设置为 fileSizeStaticText

  9. 将一个“图像”组件放置在这些“静态文本”组件下方。

  10. 将一个“消息组”组件放置在“图像”组件下方。
 

创建用于接收文件的文件夹

 
使用文件上载组件的下一步是在项目中创建一个文件夹,用于接收上载的文件。在此示例中,将图像保存到 project-directory\FileUploadExample\web\resources\images 目录。
  1. 在“项目”窗口中,展开 "FileUploadExample" >“Web 页”。右键单击 "resources" 节点并选择“新建”>“文件夹”。

  2. 在“文件夹名称”字段中键入 images,然后单击“完成”。

    images 文件夹将出现在“项目”窗口中。
 

添加代码以处理图像上载

 
现在您已经具有基本的文件上载表单和保存所上载文件的位置,必须添加代码以处理文件上载。
  1. 双击 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 目录映射到服务器上的实际文件系统路径名。如果文件不是有效的图像文件,或者上载文件时出现其他问题,则显示一条错误消息。

  2. 在 Java 编辑器中单击鼠标右键,然后选择“修复导入”。在“修复导入”对话框中,确保 java.io.File 出现在“全限定名称”字段中,然后单击“确定”。

    执行此操作后,以下 import 语句会添加到您的代码中:

    代码样例 2:Import 语句
    import com.sun.rave.web.ui.model.UploadedFile;
    import java.io.File;
    import javax.servlet.ServletContext;

  3. 在 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 应用程序的位置放在前面以构成完整路径。
 

测试应用程序

 
  1. 运行应用程序。

  2. 单击“浏览”在本地驱动器中导航,然后选择要上载的文件。图 2 为上载 JPEG 文件后的应用程序。该图像存储在 project-directory\FileUploadExample\build\web\resources\images 中。

    图 2:上载图像后的应用程序
    图 2:上载图像后的应用程序


  3. 在文件上载组件中输入一个文本文件,然后单击 Upload File 按钮。验证是否显示错误消息。

    注意:根据 Web 浏览器的不同,文件上载组件的呈现也会有所不同。请确保在用户要使用的 Web 浏览器中测试此组件。
 

执行更多操作:上载文本文件

 
此部分是一个介绍如何上载文本文件的迷你教程。在教程的示例中,使用一个“文本区域”组件显示文件的内容,并使用一个“消息组”组件显示文件的名称和大小。该示例不保存文件的内容。要保存文件的内容,您必须添加将文件保存到磁盘的代码,如上例所示。
  1. 创建一个新的“JSF Web 应用程序”项目。

  2. 将一个“文件上载”组件拖动到可视设计器上。

  3. 添加一个“按钮”组件、一个“文本区域”组件和一个“消息组”组件。

  4. 双击“按钮”组件并将以下操作代码添加到 button1_action() 方法中:

  5. 代码样例 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;
    }


  6. 按 Alt-Shift-F 组合键以修复导入并自动添加 UploadedFile import 语句。

  7. 运行应用程序。图 3 显示了一个样例页面。

    图 3:上载文本文件
    图 3:上载文本文件

 

执行更多操作:修改最大文件上载大小

 
要允许上载超过 1 MB 的文件(如大的图像文件、ZIP、JAR 或可执行文件),必须在应用程序的 web.xml 文件中修改 UploadFilter 过滤器的 maxSize 参数。
  1. 在“文件”窗口中,展开 "<项目名称>" > "Web" > "WEB-INF"。

  2. 右键单击 web-xml 节点,然后选择“编辑”。

  3. 在 XML 编辑器中,单击“过滤器”按钮。

  4. 选择 UploadFiltermaxSize 参数,单击“编辑”按钮,然后设置“参数值”。

    注意:出于安全考虑,建议您不要将 maxSize 参数设置为负值;如果将其设置为负值,则表示对文件大小没有限制。

  5. 选择“文件”>“保存”以保存更改。
注意:如果应用程序的用户试图上载大小超过 maxSize 参数值的文件,则会抛出以下异常(您无法在应用程序中捕获到该异常):
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException
 
另请参见

 
此页的最新修改时间:2006 年 1 月 25 日
[ ]