GenericPortlet - 独立于FileUpload平台

时间:2016-02-29 17:04:56

标签: java file-upload portlet apache-commons-fileupload

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

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

// 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门户网站,并且很明显它会在另一个门户网站版本上爆发。

我见过库apache commons fileupload,但我无法弄清楚如何使用它,特别是在serveResource方法中。我在examples中找到了许多javax.portlet.GenericPortlet:processAction文件上传,但serveResource中没有。 例如,我如何使用简单的

boolean isMultipart = PortletFileUpload.isMultipartContent(request);

在我的serveResource方法中?

1 个答案:

答案 0 :(得分: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);是一种方法,为ResourceRequest提供特定于门户网站的HttpServletRequest。例如,在Liferay中:

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