File upload 如何使用自定义struts.multipart.parser

File upload 如何使用自定义struts.multipart.parser,file-upload,struts2,multipartform-data,File Upload,Struts2,Multipartform Data,我想通过设置progress listener来实现自定义Struts2 MultiPartRequest,以实现渐进式文件上载 通过实现属于Core-struts2的MultiPartRequest,我编写了自定义文件上传MultiPartRequest public类FileUploadMultipartRequest实现MultiPartRequest{ 静态最终日志=LogFactory.getLog(MultiPartRequest.class); //映射参数名称->文件项对象列表

我想通过设置progress listener来实现自定义Struts2 MultiPartRequest,以实现渐进式文件上载

通过实现属于Core-struts2的MultiPartRequest,我编写了自定义文件上传MultiPartRequest

public类FileUploadMultipartRequest实现MultiPartRequest{
静态最终日志=LogFactory.getLog(MultiPartRequest.class);
//映射参数名称->文件项对象列表
私有映射文件=新的HashMap();
//映射参数名称->参数值列表
private Map params=new HashMap();
//处理此请求时出现任何错误
私有列表错误=新建ArrayList();
私人长码;
@注入(StrutsConstants.STRUTS\u MULTIPART\u MAXSIZE)
公共void setMaxSize(字符串maxSize){
this.maxSize=Long.parseLong(maxSize);
}
/**
*创建一个新的请求包装器,使用Jason Pell的方法处理多部分数据
*多部分类(请参见类描述)。
*
*@param saveDir保存文件的目录
*@param servletRequest包含多部分的请求
*@throws java.io.IOException在编码失败时抛出。
*/
公共void解析(HttpServletRequest,String saveDir)引发IOException{
DiskFileItemFactory fac=新的DiskFileItemFactory();
//确保数据已写入文件
系数setSizeThreshold(0);
if(saveDir!=null){
setRepository(新文件(saveDir));
}
ProgressMonitor=null;
//解析请求
试一试{
ServletFileUpload upload=新的ServletFileUpload(fac);
upload.setSizeMax(最大尺寸);
monitor=新的ProgressMonitor();
upload.setProgressListener(监视器);
servletRequest.getSession().setAttribute(ProgressMonitor.SESSION\u PROGRESS\u MONITOR,MONITOR);
...
}
}
...
}
我正在struts.xml中设置属性


虽然我已经在struts.xml中设置了自定义的MultipartRequestHandler,但是struts 2仍然在执行自己的JakartaMultiPartRequest(Struts2处理多部分请求的默认解析器)类,而不是我的自定义FileUploadMultipartRequest类


请给我一些解决方法。

如果您使用的是Struts 2 2.1.8+版本,那么在这种情况下,您只需将
Struts.multipart.parser
更正为
Struts.multipart.handler
之类的内容即可


在您的情况下,雅加达
jakarta
将做与
struts plugin.xml
配置文件相同的bean定义所做的事情

对于早期版本,似乎有一种方法,创建一个插件,比如说
MycustomFileUpload
。在WEB-INF/lib下,确保jar文件应该有类和struts-plugin.xml文件

将以下条目添加到
struts plugin.xml



在这种情况下,您不需要在
struts.xml
文件中定义常量。希望这对您有用。

我刚刚在2.3.4中实现了一个类似的解决方案,为上传提供了一个进度表。最简单的方法是复制JakartaMultiPartRequest并将其重命名为MonitoredMultiPartRequest

然后将函数parseRequest更改为:

私有列表解析请求(HttpServletRequest-servletRequest,
字符串saveDir)引发FileUploadException{
DiskFileItemFactory fac=createDiskFileItemFactory(saveDir);
ServletFileUpload upload=新的ServletFileUpload(fac);
upload.setSizeMax(最大尺寸);
ProgressMonitor=新的ProgressMonitor();
upload.setProgressListener(监视器);
servletRequest.getSession().setAttribute(ProgressMonitor.SESSION\u PROGRESS\u MONITOR,MONITOR);
返回upload.parseRequest(createRequestContext(servletRequest));
}
这会将progressmonitor添加到侦听器(我基于我的,然后在struts.xml中添加以下内容


正如您所看到的,我对标准值的要求过高。请参阅这里的struts-default.xml,您可以看到它是如何配置的


应该是这样的:

<struts>
  <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest"
        name="jakartax"
        class="com.cloudlabz.service.web.action.FileUploadMultipartRequest"
        scope="prototype" />

  <constant name="struts.multipart.handler" value="jakartax" /> 
</struts>


您使用的是哪个版本的struts2?请看我的答案,我相信您需要更改parserHi-Umesh。我已经尝试过将其设置为struts.multipart.handler值,但它没有调用我的自定义类。您能解释一下如何使用插件吗?遵循本教程,您也尝试过插件方法吗?我将在晚上尝试g在我的本地机器上也尝试过,但没有完成,是在您的本地机器上完成的吗?非常感谢您的倡议和帮助。在Struts2版本2.0.12中,将“struts.multipart.parser”设置为“struts.properties”文件(而不是“struts.xml”)中的完全限定类名对我很有用