Portlet 也可以上传文件,它用的是apache commons-fileupload的PortletFileUpload类

也在commons-fileupload.jar 包里面

 
  
  1. public class PortletFileUpload extends FileUpload 
  2.   public static final boolean isMultipartContent(ActionRequest request) 
  3.   { 
  4.     return FileUploadBase.isMultipartContent(new PortletRequestContext(request)); 
  5.   } 
  6.  
  7.   public PortletFileUpload() 
  8.   { 
  9.   } 
  10.  
  11.   public PortletFileUpload(FileItemFactory fileItemFactory) 
  12.   { 
  13.     super(fileItemFactory); 
  14.   } 
  15.  
  16.   public List parseRequest(ActionRequest request) 
  17.     throws FileUploadException 
  18.   { 
  19.     return parseRequest(new PortletRequestContext(request)); 
  20.   } 
  21.  
  22.   public FileItemIterator getItemIterator(ActionRequest request) 
  23.     throws FileUploadException, IOException 
  24.   { 
  25.     return super.getItemIterator(new PortletRequestContext(request)); 
  26.   } 

 

要上传文件,官方教程给了一个例子。

上传动作位于java代码中:

 
  
  1. //创建一个PortletFileUpload的对象
  2. PortletFileUpload pfu = new PortletFileUpload(); 
  3. //设置可以被上传的文件的最大字节数
  4. pfu.setFileSizeMax(MAX_UPLOAD_FILE_SIZE); 
  5. //校验来自Portlet的请求是否是一个文件上传请求,当前仅当ActionRequest的请求头内容类型是multipart/form-data时候才返回真
  6. if(PortletFileUpload.isMultipartContent(request)) { 
  7. //如果是一个文件上传请求,那么创建一个迭代器,用于迭代所有被上传的File
  8. FileItemIterator iter = pfu.getItemIterator(request); 
  9. while (iter.hasNext()) { 
  10. //每一个FileItemStream都打开一个文件流用于操作上传的某个File
  11. FileItemStream item = iter.next(); 
  12. InputStream stream = item.openStream(); 
  13. byte[] buffer = new byte[1024]; 
  14. while (true) { 
  15. if (!item.isFormField()) { 
  16. byte[] bytes = new byte[buffer]; 
  17. stream.read(bytes); 

然后在页面上,我们必须创建一个表单,并且设置其类型为multipart/form-data

 
  
  1. <form name="uploadTocForm" method="post" 
  2.  
  3. action="${uploadTocActionUrl}" enctype="multipart/form-data"> 

然后在form内部,因为可以多文件上传,所以每一个上传控件都应该写为:

 
  
  1. <input type="file" name="tocFile"/> 

它等价于代码中的FileItem