最近遇到一个文件上传的项目,而且在这个项目中遇到的文件上传的次数还是挺多的,所以就写了个Filter过滤器。这一个想法还是从一本书上看到的,所以原则上说并不是在下原创。不过因为补充了一点东西,所以,嘿嘿,不说了。
在建湖等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、成都做网站 网站设计制作定制网站建设,公司网站建设,企业网站建设,成都品牌网站建设,成都营销网站建设,外贸营销网站建设,建湖网站建设费用合理。首先需要写个Filter:
package yin.filter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.MultipartConfig; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import org.apache.commons.fileupload.DiskFileUpload; import org.apache.commons.fileupload.FileItem; public class Uploadfilter implements Filter { private String encoding; @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { UploadRequestWrapper uploadRequestWrapper = new UploadRequestWrapper((HttpServletRequest)request); chain.doFilter(uploadRequestWrapper, response); } @Override public void init(FilterConfig config) throws ServletException { encoding = config.getServletContext().getInitParameter("encoding"); if (encoding == null) { encoding = "utf-8"; } } class UploadRequestWrapper extends HttpServletRequestWrapper { // 文件头类型 private static final String MULTIPART_HEADER = "Content-type"; // 是否是上传文件 private boolean multipart; //保存提交的数据 private Mapparams = new HashMap (); @SuppressWarnings("deprecation") public UploadRequestWrapper(HttpServletRequest request) { super(request); // 判断是否是上传文件 multipart = request.getHeader(MULTIPART_HEADER) != null && request .getHeader(MULTIPART_HEADER).startsWith("multipart/form-data"); // 如果是上传文件 if (multipart) { try { DiskFileUpload upload = new DiskFileUpload(); // 使用apache进行上传 // 设置编码 upload.setHeaderEncoding(encoding); // 解析上传的数据 List fileItems = upload.parseRequest(request); // 遍历 for (Iterator it = fileItems.iterator(); it.hasNext();) { // 获取当前的FileItem FileItem item = (FileItem) it.next(); // 如果是文本域 if (item.isFormField()) { params.put(item.getFieldName(), item.getString(encoding)); } else { // 替换特殊字符 String filename = item.getName().replace("\\", "/"); filename = filename.substring(filename.lastIndexOf("/")+1); // 保存到系统临时文件夹中 java.io.File file = new File(System.getProperty("java.io.tmpdir"), filename); // 新建文件输出流 OutputStream ops = new FileOutputStream(file); // 输出到文件流中 ops.write(item.get()); // 关闭文件流 ops.close(); // 将值放到Map中 params.put(item.getFieldName(), file); } } } catch (Exception e) { e.printStackTrace(); } } } @Override public Object getAttribute(String name) { // 如果是上传文件,则从Map中取值,支持直接获取文件对象 if (multipart && params.containsKey(name)) { return params.get(name); } return super.getAttribute(name); } @Override public String getParameter(String name) { // 如果是上传文件,则从Map中取值, if (multipart && params.containsKey(name)) { return params.get(name).toString(); } return super.getParameter(name); } } }
好了,Filter写完了,那么就修改配置文件web.xml吧,如下:
Uploadfilter yin.filter.Uploadfilter Uploadfilter /*
以上只是文件上传的Filter,那么该怎样使用了。放心,在下会说滴:
我们现在先写一个简单的上传的jsp文件,
由于样式什么的没有调整,难看点也是无所谓的吧!
然后在servlet中使用:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=utf-8"); // 读取表单内容 String name = request.getParameter("uname"); String psw = request.getParameter("psw"); File headPic = (File) request.getAttribute("file"); FileWriterWrapper write = new FileWriterWrapper(request, headPic); }
大家有没有发现,这样选取表单中的内容是比较方便的,那么然后
FileWriterWrapper write = new FileWriterWrapper(request, headPic);
这一行代码就是将读取到的文件写入到硬盘中了,
package yin.usual; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; public class FileWriterWrapper { public FileWriterWrapper() { // TODO Auto-generated constructor stub } // 文件写入的方法 public FileWriterWrapper(HttpServletRequest request,File file) { try { // 读取上下文配置,获取路径 ServletContext context = request.getServletContext(); String filename = context.getInitParameter("filename"); // 获取文件保存路径 filename = context.getRealPath(filename); // 如果路径不存在,则创建 if(!new File(filename).isDirectory()) { System.out.println("文件不存在,正在创建。。。"); new File(filename).mkdirs(); } // 获取文件名 String picname = file.getName().replace("/", "\\"); picname = picname.substring(picname.lastIndexOf("\\")+1, picname.length()); // 获取文件保存位置 String path = filename +"\\"+picname; System.out.println("文件保存在:" + path); FileInputStream fis = new FileInputStream(file); FileOutputStream fos = new FileOutputStream(path); byte[] bs = new byte[1024*1024*4]; int len = 0; while((len = fis.read(bs)) != -1) { fos.write(bs, 0, len); } // 关闭文件 fis.close(); fos.close(); System.out.println("文件写入成功"); } catch (IOException e) { System.out.println("文件写入失败"); e.printStackTrace(); } } }
接下来,大家看看配置:
filename /imgs
看到这,不知道大家有没有一个疑问,如果表单中的上传文件有多个,那么怎么办?如果这样就需要修改
FileWriterWrapper
类了,可以将获取上下文配置中的路径放在Servlet中,这样就可以了,具体操作在下就不书写了。。
以上内容如有错误,欢迎指出。。。
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。