在 IBM 的 Portlet 中带有响应的文件上传

FIle Upload with response in Portlet For IBM

需要实现的目标: 我一直在尝试找到一种方法来上传文件并使用 Json 发送响应,如果它在 IBM Websphere Portlet 中使用 AJAX

成功的话

我是如何做到其中一部分的: 我能够使用 ActionURL 上传文件,但在 Action 中我无法找到从 ActionMapping

发送响应的方法

需要的方法: 我知道我们可以使用 ResourceMapping 发送响应,但我找不到在 Resouce Mapping

上上传文件的方法

Working Code For File Upload Which needs to be updated for Recieving Response in AJAX

JSP

<form:form method="POST" 
modelAttribute="uploadForm" 
enctype="multipart/form-data">
  <input type="file" name="logo" id="logo"/>
 <button tabindex="2" type="submit" name="Next" value="Upload" id="Next" >Next</button>
</form:form>

Code:For IBM Portlet

@ActionMapping(params="file=processUploadedFile")
   public void processUploadedFileNew(@RequestParam("logo") MultipartFile file,
          final  ActionRequest request,final ActionResponse response) throws IOException {
//I was able to Handle Code here
      }

然而,对于上面的代码,我想将请求更改为 AJAX,并且不需要重新加载页面,因此我需要将操作更改为资源。

注: 我知道您可以将参数从 ActionMapping 发送到 RenderMapping 并在 ModelAndView 中发回数据的技术,但这是不需要的,因为我希望在 AJAX Success Data

中返回响应

由于 portlet 两阶段呈现过程,我认为您尝试做的事情不会奏效。

两个建议要么使用旧的单个 portlet 刷新并发回 json 数据(尽管仍然无法更改该响应的数据类型)

或者使用与 portlet 打包在一起的单独的 servlet,并通过它发送它

我找到了解决方案。请参阅以下使用 Jar

的解决方案
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.servlet.ServletRequestContext;

Code
@ResourceMapping(value = "uploadfile")
    public void processUploadedFile(final ResourceRequest request, final ResourceResponse response, final PortletRequest portletRequest){

HttpServletRequest originalHttpServletRequest = (HttpServletRequest) (com.ibm.ws.portletcontainer.portlet.PortletUtils.getHttpServletRequest(request));
        final boolean multipartContent = FileUploadBase.isMultipartContent(new ServletRequestContext(originalHttpServletRequest));

        if (multipartContent) {
            file= createPEService.getResourceToBeUploaded(originalHttpServletRequest,file,bytes);
        }
}

Jsp 文件:

<portlet:resourceURL id="uploadfile"
    var="uploadfile" />

  <form class="testClass" enctype="multipart/form-data">
     </form>

JS:

isMultipart = 'multipart/form-data' === referenceForm.enctype,
 var $referenceForm = $( e.currentTarget ).parents( 'form' ),
                        referenceForm = $referenceForm.get( 0 ),
$.ajax({
                    type: 'POST',
                    url: ${uploadfile},
                    processData: ! ( isMultipart ),
                    contentType: isMultipart ? false : 'application/x-www-form-urlencoded; charset=UTF-8',
                    data: isMultipart ? new FormData( referenceForm ) : $referenceForm.serialize(),
                    cache: false
                }).done(function( data ) {
               }