- 浏览: 4362 次
- 性别:
- 来自: 西安
最新评论
1.struts文件配置
<!--文件大小限制-->
<constant name="struts.multipart.maxSize" value="1073741824" />
<!--文件上传临时目录-->
<constant name="struts.multipart.saveDir" value="tmp"></constant>
<!--处理类声明-->
<bean
type="org.apache.struts2.dispatcher.multipart.MultiPartRequest"
name="perfmpr"
class="com.huawei.devportal.common.PerfMultiPartRequest"
scope="default" />
<!--处理类定义-->
<constant name="struts.multipart.handler" value="perfmpr" />
2.编写处理类 继承JakartaMultiPartRequest
package com.huawei.devportal.common;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest;
import com.huawei.portalone.common.log.Log;
import com.huawei.portalone.common.log.LogManager;
/**
* 在原有JakartaMultiPartRequest处理类的基础上做了调整,解决在大并发下文件上传,
* 导致生成大量临时文件没有清理问题
*/
public class PerfMultiPartRequest extends JakartaMultiPartRequest
{
private static final Log log = LogManager.getDebugLog();
/**
* 解析时在原有JakartaMultiPartRequest处理类的基础上做了两个调整,原有parse函数版权归apache的struts所有。
* 1.在处理附件时设置1M的内存,用于临时存放文件,避免每次都写文件。
* 原先struts:fac.setSizeThreshold(0); //原先原码里面还标明了直接写文件,但是不知道为啥这样做,不知道哪位达人清楚原因。
* 新调整为:fac.setSizeThreshold(1024 * 1024);
* 2.对于formfield的项,解析完成就删除,不用遗留到最后用gc删除。遗留延迟删除会导致生成大量垃圾小文件。
* 新增:item.delete();
*
*
* @param saveDir the directory to save off the file
* @param servletRequest the request containing the multipart
* @throws java.io.IOException is thrown if encoding fails.
*/
public void parse(HttpServletRequest servletRequest, String saveDir)
throws IOException
{
DiskFileItemFactory fac = new DiskFileItemFactory();
fac.setSizeThreshold(1024 * 1024);
if (saveDir != null)
{
fac.setRepository(new File(saveDir));
}
// Parse the request
ServletFileUpload upload = new ServletFileUpload(fac);
upload.setSizeMax(maxSize);
servletRequest.setAttribute("maxSize", maxSize);
List<FileItem> items = null;
try
{
items = (List<FileItem>)upload.parseRequest(createRequestContext(servletRequest));
for (Object item1 : items)
{
FileItem item = (FileItem) item1;
String itemFieldName = item.getFieldName();
if (log.isDebugEnabled())
{
log.debug("Found item " + itemFieldName);
}
if (item.isFormField())
{
log.debug("Item is a normal form field");
List<String> values = params.get(itemFieldName);
if (null == values)
{
values = new ArrayList<String>();
}
String charset = servletRequest.getCharacterEncoding();
if (null == charset)
{
values.add(item.getString());
}
else
{
values.add(item.getString(charset));
}
params.put(itemFieldName, values);
item.delete();
}
else
{
log.debug("Item is a file upload");
// Skip file uploads that don't have a file name - meaning that no file was selected.
if (null == item.getName()
|| item.getName().trim().length() < 1)
{
log.debug("No file has been uploaded for the field: "
+ itemFieldName);
continue;
}
List<FileItem> values = files.get(itemFieldName);
if (null == values)
{
values = new ArrayList<FileItem>();
}
if (item.isInMemory())
{
try
{
item.write(((DiskFileItem)item).getStoreLocation());
}
catch (Exception e)
{
log.warn("Unable to write item", e);
errors.add(e.getMessage());
}
}
values.add(item);
files.put(itemFieldName, values);
}
}
}
catch (FileUploadException e)
{
log.warn("Unable to parse request", e);
errors.add(e.getMessage());
}
}
/**
* 由于parse需要此函数,但是JakartaMultiPartRequest类不允许子类访问,所以
* 这里又重新定义一遍。此方法沿用JakartaMultiPartRequest类的createRequestContext类处理,
* 没有做任何调整
*
* @param req the request.
* @return a new request context.
*/
private RequestContext createRequestContext(final HttpServletRequest req)
{
return new RequestContext()
{
public String getCharacterEncoding()
{
return req.getCharacterEncoding();
}
public String getContentType()
{
return req.getContentType();
}
public int getContentLength()
{
return req.getContentLength();
}
public InputStream getInputStream() throws IOException
{
InputStream inputStream = req.getInputStream();
if (inputStream == null)
{
throw new IOException("Missing content in the request");
}
return req.getInputStream();
}
};
}
}
/**
public void preExecute() throws DVException
{
if (httpServletRequest instanceof MultiPartRequestWrapper)
{
MultiPartRequestWrapper requestWrapper = (MultiPartRequestWrapper) httpServletRequest;
if (requestWrapper.hasErrors())
{
Collection<String> errors = requestWrapper.getErrors();
if (errors != null && !errors.isEmpty())
{
Iterator iterator = errors.iterator();
long maxSize = 0;
if (requestWrapper.getAttribute("maxSize") != null)
{
maxSize = Long.parseLong(requestWrapper.getAttribute("maxSize")
.toString());
maxSize = maxSize / 1024 / 1024;
}
while (iterator.hasNext())
{
String errorMess = (String) iterator.next();
log.warn(errorMess);
throw new DVException(
ErrorNumber.Resource.RESOURCE_ADD_FILE_SIZE,
new String[] {maxSize + ""});
}
}
return;
}
Enumeration<String> parameterNames = requestWrapper.getFileParameterNames();
while (parameterNames.hasMoreElements())
{
@SuppressWarnings("unused")
String paramterName = parameterNames.nextElement();
File[] files = requestWrapper.getFiles(paramterName);
if (null == files || files.length == 0)
{
continue;
}
else if (files.length == 1)
{
FileBean fileBean = new FileBean();
fileBean.setAbsolutePath(files[0].getAbsolutePath());
fileBean.setFileSize(files[0].length());
fileBean.setFilename(requestWrapper.getFileNames(paramterName)[0]);
this.fileMap.put(paramterName, fileBean);
}
else
{
ArrayList<FileBean> list = new ArrayList();
for (int i = 0; i < files.length; i++)
{
File file = files[i];
FileBean fileBean = new FileBean();
fileBean.setAbsolutePath(file.getAbsolutePath());
fileBean.setFileSize(file.length());
fileBean.setFilename(requestWrapper.getFileNames(paramterName)[i]);
list.add(fileBean);
}
this.fileMap.put(paramterName, list);
}
}
}
}
**/
<!--文件大小限制-->
<constant name="struts.multipart.maxSize" value="1073741824" />
<!--文件上传临时目录-->
<constant name="struts.multipart.saveDir" value="tmp"></constant>
<!--处理类声明-->
<bean
type="org.apache.struts2.dispatcher.multipart.MultiPartRequest"
name="perfmpr"
class="com.huawei.devportal.common.PerfMultiPartRequest"
scope="default" />
<!--处理类定义-->
<constant name="struts.multipart.handler" value="perfmpr" />
2.编写处理类 继承JakartaMultiPartRequest
package com.huawei.devportal.common;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest;
import com.huawei.portalone.common.log.Log;
import com.huawei.portalone.common.log.LogManager;
/**
* 在原有JakartaMultiPartRequest处理类的基础上做了调整,解决在大并发下文件上传,
* 导致生成大量临时文件没有清理问题
*/
public class PerfMultiPartRequest extends JakartaMultiPartRequest
{
private static final Log log = LogManager.getDebugLog();
/**
* 解析时在原有JakartaMultiPartRequest处理类的基础上做了两个调整,原有parse函数版权归apache的struts所有。
* 1.在处理附件时设置1M的内存,用于临时存放文件,避免每次都写文件。
* 原先struts:fac.setSizeThreshold(0); //原先原码里面还标明了直接写文件,但是不知道为啥这样做,不知道哪位达人清楚原因。
* 新调整为:fac.setSizeThreshold(1024 * 1024);
* 2.对于formfield的项,解析完成就删除,不用遗留到最后用gc删除。遗留延迟删除会导致生成大量垃圾小文件。
* 新增:item.delete();
*
*
* @param saveDir the directory to save off the file
* @param servletRequest the request containing the multipart
* @throws java.io.IOException is thrown if encoding fails.
*/
public void parse(HttpServletRequest servletRequest, String saveDir)
throws IOException
{
DiskFileItemFactory fac = new DiskFileItemFactory();
fac.setSizeThreshold(1024 * 1024);
if (saveDir != null)
{
fac.setRepository(new File(saveDir));
}
// Parse the request
ServletFileUpload upload = new ServletFileUpload(fac);
upload.setSizeMax(maxSize);
servletRequest.setAttribute("maxSize", maxSize);
List<FileItem> items = null;
try
{
items = (List<FileItem>)upload.parseRequest(createRequestContext(servletRequest));
for (Object item1 : items)
{
FileItem item = (FileItem) item1;
String itemFieldName = item.getFieldName();
if (log.isDebugEnabled())
{
log.debug("Found item " + itemFieldName);
}
if (item.isFormField())
{
log.debug("Item is a normal form field");
List<String> values = params.get(itemFieldName);
if (null == values)
{
values = new ArrayList<String>();
}
String charset = servletRequest.getCharacterEncoding();
if (null == charset)
{
values.add(item.getString());
}
else
{
values.add(item.getString(charset));
}
params.put(itemFieldName, values);
item.delete();
}
else
{
log.debug("Item is a file upload");
// Skip file uploads that don't have a file name - meaning that no file was selected.
if (null == item.getName()
|| item.getName().trim().length() < 1)
{
log.debug("No file has been uploaded for the field: "
+ itemFieldName);
continue;
}
List<FileItem> values = files.get(itemFieldName);
if (null == values)
{
values = new ArrayList<FileItem>();
}
if (item.isInMemory())
{
try
{
item.write(((DiskFileItem)item).getStoreLocation());
}
catch (Exception e)
{
log.warn("Unable to write item", e);
errors.add(e.getMessage());
}
}
values.add(item);
files.put(itemFieldName, values);
}
}
}
catch (FileUploadException e)
{
log.warn("Unable to parse request", e);
errors.add(e.getMessage());
}
}
/**
* 由于parse需要此函数,但是JakartaMultiPartRequest类不允许子类访问,所以
* 这里又重新定义一遍。此方法沿用JakartaMultiPartRequest类的createRequestContext类处理,
* 没有做任何调整
*
* @param req the request.
* @return a new request context.
*/
private RequestContext createRequestContext(final HttpServletRequest req)
{
return new RequestContext()
{
public String getCharacterEncoding()
{
return req.getCharacterEncoding();
}
public String getContentType()
{
return req.getContentType();
}
public int getContentLength()
{
return req.getContentLength();
}
public InputStream getInputStream() throws IOException
{
InputStream inputStream = req.getInputStream();
if (inputStream == null)
{
throw new IOException("Missing content in the request");
}
return req.getInputStream();
}
};
}
}
/**
public void preExecute() throws DVException
{
if (httpServletRequest instanceof MultiPartRequestWrapper)
{
MultiPartRequestWrapper requestWrapper = (MultiPartRequestWrapper) httpServletRequest;
if (requestWrapper.hasErrors())
{
Collection<String> errors = requestWrapper.getErrors();
if (errors != null && !errors.isEmpty())
{
Iterator iterator = errors.iterator();
long maxSize = 0;
if (requestWrapper.getAttribute("maxSize") != null)
{
maxSize = Long.parseLong(requestWrapper.getAttribute("maxSize")
.toString());
maxSize = maxSize / 1024 / 1024;
}
while (iterator.hasNext())
{
String errorMess = (String) iterator.next();
log.warn(errorMess);
throw new DVException(
ErrorNumber.Resource.RESOURCE_ADD_FILE_SIZE,
new String[] {maxSize + ""});
}
}
return;
}
Enumeration<String> parameterNames = requestWrapper.getFileParameterNames();
while (parameterNames.hasMoreElements())
{
@SuppressWarnings("unused")
String paramterName = parameterNames.nextElement();
File[] files = requestWrapper.getFiles(paramterName);
if (null == files || files.length == 0)
{
continue;
}
else if (files.length == 1)
{
FileBean fileBean = new FileBean();
fileBean.setAbsolutePath(files[0].getAbsolutePath());
fileBean.setFileSize(files[0].length());
fileBean.setFilename(requestWrapper.getFileNames(paramterName)[0]);
this.fileMap.put(paramterName, fileBean);
}
else
{
ArrayList<FileBean> list = new ArrayList();
for (int i = 0; i < files.length; i++)
{
File file = files[i];
FileBean fileBean = new FileBean();
fileBean.setAbsolutePath(file.getAbsolutePath());
fileBean.setFileSize(file.length());
fileBean.setFilename(requestWrapper.getFileNames(paramterName)[i]);
list.add(fileBean);
}
this.fileMap.put(paramterName, list);
}
}
}
}
**/
- 重写struts2文件上传处理类.rar (3.3 KB)
- 下载次数: 11
相关推荐
NULL 博文链接:https://namas.iteye.com/blog/1130854
-- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper --> <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class=...
CI框架重写文件上传类pdf Class CI_Upload { var $dir; //附件存放物理目录 var $dirtype = 2;//0 为不创建子目录 var $allow_types; //允许上传附件类型 var $field; //上传控件名称 var $maxsize; //最大允许文件...
文件上传 带进度条 fileupload 类部分重写
其实,开发自定义标签并不需要Struts2的支持,一般情况下,只需要继承javax.servlet.jsp.tagext.BodyTagSupport类,重写doStartTag,doEndTag等方法即可。这里在实现自定义标签时,继承的2个类分别是org.apache....
最近开发项目的时候,遇到Struts2需要URL重写的问题,总结了下资料,和大家分享!!
1、内含两个文件:①、UEditorDemo.rar ②、UEdtior的简单使用.doc;...5、最后一点是提示:如果要把UEditor使用在struts中,要重写web.xml中所有过滤.jsp或者.*的过滤器,不然上传图片和文件会失败。
struts2的输入校验有两种方式: 一.重写validate()方式 二.采用配置文件的方式 先我们就以一个简单的登录的例子来讲解这个吧. 重点讲解下,第二个采用配置文件的方式: 1.添加一个xml的校验文件,保存在...
这几天用到了UEDITOR的文件上传功能,但是UEDITOR自带的文件上传功能只能将文件上传到项目根目录.百度搜索也没有很多相关的资料,更关键的是没有相关的源代码. 所以今天把我自己实现的这部分代码上传,希望大家共同进步...
C++重写String类C++重写String类C++重写String类C++重写String类
这个东西相对比较简单但是也有局限性就是重写struts的过滤文件,但是使用起来很方便直接调用接好了,还有就是它是不允许上传的图片之类的东文件的,这一点在某种意义上比较好就是安全,但是可以添加图片的地址与上传...
贴一个挫挫的类,献给正在学BMP文件格式的同学 使用范围:24位BMP位图(无调色板); 如何增加使用范围:改写GetPixel函数,与SetPixelRGB函数; 如何增加调色板: 改写Load函数,其中添加对调色板的读取。 改写...
一个简单的struts 的URL 重写(伪静态)例子
文件批量处理百宝箱通过单次/组合使用,可实现常见的文件批量更名需要和一些文件批量处理需要。集专一性、普适性、灵活性。界面友好,人性化设计,功能实用,是一款不可多得的实用性强的小工具箱。本工具箱提供了...
这可以通过重写QComboBox类的showPopup方法来实现。 本资源提供了一个基于PySide2框架的QComboBox子类,其中重写了showPopup方法。通过继承原始的QComboBox类并重写其方法,我们可以确保每次点击下拉列表框时,都会...
flink 实现将kafka的数据读取出来,并经过xml配置和重写算子方式实现数据处理并写到kafka
这个编辑器相对于fckeditor来说相对比较好因为这个在于struts2整合的时候不用再去重写过滤文件了
自己开发的sharepoint2007上传图片功能重写(支持本地上传)