在portlet模式下,有一个可以工作的Struts2 portlet环境,其中我无法使Struts fileUpload工作。
我看得出来
我在一个剥离的Spring 2应用程序中尝试了同样的方法,这个问题与主项目中的问题相同。遵循以下代码
https://struts.apache.org/core-developers/file-upload.html
用于JSP和操作类。portlet被创建,流程工作,但在操作中没有文件。
标准Sping Boot 2有额外的pom:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.5.20</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>Struts.xml
<package name="uploadtest" extends="struts-portlet-default" namespace="/uploadtest">
<action name="uploadtestPrepare" class="bouvet.no.fileuploadtest.action.FileUploadSubmitAction">
<result name="success">/WEB-INF/struts2/test/fileUpload.jsp</result>
</action>
<action name="uploadTestSubmit" class="bouvet.no.fileuploadtest.action.FileUploadSubmitAction">
<result name="success">/WEB-INF/struts2/test/fileUpload.jsp</result>
</action>
</package>以及形式
<s:form action="uploadTestSubmit" method="post" enctype="multipart/form-data">
FileName: <s:property value="%{filename}"/>
<s:file name="upload" label="File" />
<s:submit/>
</s:form>策划人
public void setUploadFileName(String filename) {
this.filename = filename;
}这是portlet模式中的一个bug,还是缺少了一个键依赖项、组件、版本?另一种方法?
在图像( JSR168 dispatcher中的断点)中,文件是存在的。在服务器之后运行的第一段代码。JSR168调度程序中的断点
发布于 2019-04-19 07:31:10
本例中的解决方案是退一步,查看请求中存在的内容。实际上,portlet正在运行的CMS在上传到portlet环境之前负责上传。我找到的雅加达包装器是由CMS创建的,但它不在portlet范围之外。
解决方案:
public String intercept(ActionInvocation invocation) throws Exception {
final ActionContext context = invocation.getInvocationContext();
Object action = invocation.getAction();
try {
if (action instanceof FileUploadAware) {
HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);
// if (request instanceof MultipartRequestWrapper) {
File file = (File) request.getAttribute("upload");
((FileUploadAware) action).setFile(file);
// }
}
}catch (Exception e){
LOG.error("Exception? {}", e);
}finally {
return invocation.invoke();
}这不是最后的解决方案,而是一个拦截器,它在请求中找到一个upload属性,并将其放到一个FileUploadAware操作中。属性是CMS截获并创建的本地临时文件。对于我来说,这是一个针对CMS的特殊解决方案,还是一个用于portlet的通用解决方案?不知道。
https://stackoverflow.com/questions/55630802
复制相似问题