2016-02-29 60 views
0

简短问题:如何在javax.portlet.GenericPortlet:serveResource方法实现中处理文件上传,保持代码门户平台独立?GenericPortlet - FileUpload平台独立

长问题:我创建了一个javax.portlet.GenericPortlet的实现。此portlet必须部署在WebSphere Portal和Liferay Portal上。在此Portlet的serveResource方法中,我读取了multipart/form-data请求。据我所知,在Liferay中我可以处理文件上传这样:

// save the request attached file from the client 
UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(resourceRequest); 
String fileName = uploadRequest.getFileName(paramFile); 
InputStream inputStream = uploadRequest.getFileAsStream(paramFile, true); 

与此代码段的问题是,它依赖于Liferay门户和obviusly它要打破在另一个门户网站版本。

我已经看到了库apache commons fileupload但我无法弄清楚如何使用它,特别是在的serveResource方法。我发现文件上传许多examplesjavax.portlet.GenericPortlet:processAction,但没有在serveResource。 例如,我怎样可以使用简单

boolean isMultipart = PortletFileUpload.isMultipartContent(request); 
serveResource方法

回答

0

最后我发现我自己的解决方案。

import java.io.File; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
import java.util.ResourceBundle; 

import javax.portlet.PortletRequest; 
import javax.servlet.http.HttpServletRequest; 

import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.FileUploadBase; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import org.apache.commons.fileupload.servlet.ServletRequestContext; 

public class MyPortlet extends GenericPortlet { 

    @Override 
    public void serveResource(ResourceRequest request, ResourceResponse resourceResponse) throws PortletException, IOException { 

     final HttpServletRequest originalHttpServletRequest = portalService.getOriginalHttpServletRequest(request); 
     final boolean multipartContent = FileUploadBase.isMultipartContent(new ServletRequestContext(originalHttpServletRequest)); 
     if (multipartContent) { 
      // Create a factory for disk-based file items 
      DiskFileItemFactory factory = new DiskFileItemFactory(); 
      // Set factory constraints 
      factory.setSizeThreshold(yourMaxMemorySize); 
      factory.setRepository(yourTempDirectory); 
      // Create a new file upload handler 
      ServletFileUpload upload = new ServletFileUpload(factory); 
      // Set overall request size constraint 
      upload.setSizeMax(yourMaxRequestSize); 

      List<FileItem> items = upload.parseRequest(originalHttpServletRequest); 

      // Process the uploaded items 
      Iterator<FileItem> iter = items.iterator(); 
      while (iter.hasNext()) { 
       FileItem thisItem = (FileItem) iter.next(); 
       final String fieldName = thisItem.getFieldName(); 
       // if an element is a form field 
       if (thisItem.isFormField()) { 
        if (fieldName.equals("yourfieldformparam")) { 
         String value = thisItem.getString(); 
         // Do something with the value 
        } 
       } else { 
        // if its an attachment you can do... 
        String fileName = item.getName(); 
        String contentType = item.getContentType(); 
        boolean isInMemory = item.isInMemory(); 
        long sizeInBytes = item.getSize(); 

        File fileOut = File.createTempFile(IMieiPagamentiConstants.FILE_PREFIX, null); 
        // delete on jvm exit 
        fileOut.deleteOnExit(); 
        // write the file 
        thisItem.write(fileOut); 

        //... 
       } 
      } 
     } 
    } 
} 

portalService.getOriginalHttpServletRequest(request);是给你下的HttpServletRequest的ResourceRequest的特定于门户的方法。例如,在Liferay的:

@Override 
    public HttpServletRequest getOriginalHttpServletRequest(PortletRequest request) { 
     return PortalUtil.getOriginalServletRequest(getHttpServletRequest(request)); 
    }