`

文件上传进行封装

    博客分类:
  • cms
 
阅读更多
BaseServlet.java
if(isMultipart){ //如果是上传文件
				request = new MultipartRequestWrapper(request);
			}

MultipartRequestWrapper.java
package cn.com.leadfar.cms.backend.view;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;
import org.apache.commons.io.FilenameUtils;

import cn.com.leadfar.cms.backend.model.Attachment;

public class MultipartRequestWrapper extends HttpServletRequestWrapper {

	private Map allParams;
	
	public MultipartRequestWrapper(HttpServletRequest request) {
		super(request);
		
		//首先判断是否multipart编码类型
		//如果是multipart编码类型,就逐个从request中取出各个表单域
		//如果表单域是普通的表单域,则将它的值取出,放到allParams中
		//如果表单域是文件,则
		//1、把文件先存储到磁盘的某个目录中!
		//2、把文件的有关信息(名称,类型,上传时间)包装成Attachment[]类型
		//3、把包装好的Attachment[]类型,放到allParams中

		try {
			//首先,判断是否multipart编码类型
			boolean isMultipart = ServletFileUpload.isMultipartContent(request);
			if(!isMultipart){
				allParams = request.getParameterMap();
			}else{
				allParams = new HashMap();
				ServletFileUpload upload = new ServletFileUpload();
				FileItemIterator iter = upload.getItemIterator(request);
				while(iter.hasNext()){
					FileItemStream item = iter.next();
					//得到表单域的名称
				    String name = item.getFieldName();
				    //得到表单域的值(这是一个输入流)
				    InputStream stream = item.openStream();
				    
				    //如果是普通表单域
				    if(item.isFormField()){
				    	String value = Streams.asString(stream,request.getCharacterEncoding());
				    	addFieldsAndValuesToMap(name, value);
				    }else{ //如果是文件
				    	if(stream.available() != 0){//如果文件域没有选择文件,则忽略处理
					    	String filename = item.getName(); //得到上传的文件名称
					    	if(filename != null){
					    		//因为在IE下面,上传的文件还包含有此文件在客户端机器的路径
					    		//所以,要把这个路径去掉,只取文件名
					    		filename = FilenameUtils.getName(filename);
					    	}
					    	//将上传文件的输入流输出到磁盘的文件上
					    	Streams.copy(stream, new FileOutputStream(Attachment.ATTACHMENT_DIR+filename), true);
					    	
					    	Attachment attachment = new Attachment();
					    	attachment.setContentType(item.getContentType());
					    	attachment.setName(filename);
					    	attachment.setUploadTime(new Date());
					    	addFieldsAndValuesToMap(name, attachment);
				    	}
				    }
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
	
	private void addFieldsAndValuesToMap(String name,String value){
		String[] fieldValues = (String[])allParams.get(name);
		if(fieldValues == null){
			allParams.put(name, new String[]{value});
		}else{
			//比如原来数组:["1","2"]
			//扩充之后:["1","2",null]
			fieldValues = Arrays.copyOf(fieldValues, fieldValues.length+1);
			fieldValues[fieldValues.length - 1] = value;
			allParams.put(name, fieldValues);
		}
	}
	
	private void addFieldsAndValuesToMap(String name,Attachment value){
		Attachment[] fieldValues = (Attachment[])allParams.get(name);
		if(fieldValues == null){
			allParams.put(name, new Attachment[]{value});
		}else{
			//比如原来数组:["1","2"]
			//扩充之后:["1","2",null]
			fieldValues = Arrays.copyOf(fieldValues, fieldValues.length+1);
			fieldValues[fieldValues.length - 1] = value;
			allParams.put(name, fieldValues);
		}
	}	

	@Override
	public String getParameter(String name) {
		String[] values = (String[])allParams.get(name);
		if(values != null){
			return values[0];
		}
		return null;
	}

	@Override
	public Map getParameterMap() {
		return allParams;
	}
}

 

分享到:
评论

相关推荐

    文件上传的封装

    "文件上传的封装"这个标题涉及到的是如何通过编程来实现一个高效且安全的文件上传接口。下面将详细讨论这个主题。 首先,我们从“源码”这个标签出发,理解文件上传的封装通常涉及编写代码来处理文件的接收、验证、...

    单文件与多文件的上传封装

    本教程将详细讲解如何对PHP的单文件和多文件上传进行封装,以实现高效且健壮的文件上传功能。 一、单文件上传 1. **表单设置**:在HTML页面中,我们需要创建一个包含`<input type="file">`的表单元素,允许用户...

    uniapp文件上传方法封装

    uniapp文件上传方法封装

    php-upload封装类上传文件,多单文件上传.zip

    本压缩包“php-upload封装类上传文件,多单文件上传.zip”提供了一个完整的PHP文件上传解决方案,包括单文件和多文件上传功能,并附带了演示示例。 核心知识点: 1. **PHP文件上传原理**:PHP通过`$_FILES`全局变量...

    多文件上传封装好的javascript文件类

    "多文件上传封装好的javascript文件类" 提供了解决这个问题的一种方法。这个JS类是专门为实现批量文件上传而设计的,简化了前端与服务器之间的交互流程。在深入探讨这个类之前,我们需要先理解一些基本概念。 **...

    微信小程序封装上传文件组件

    为了实现这一功能,开发者通常需要封装一个专门用于上传文件的组件。本篇将详细探讨如何在微信小程序中封装一个上传图片的组件,并讨论相关的技术要点。 首先,微信小程序提供了`wx.chooseImage`接口,用于让用户从...

    php文件上传代码以及封装的上传类

    php文件上传代码以及封装的上传类,<?php //接收 $username=$_POST['username']; $fileintro=$_POST['fileintro']; //echo $username.$fileintro; //获取文件信息 /* echo "<pre>"; print_r($_FILES); ...

    自己封装的Flex文件上传组件FileInput

    《自封装Flex文件上传组件FileInput详解》 在IT行业中,开发用户友好的文件上传功能是常见的需求。本文将深入探讨一个自封装的Flex文件上传组件——FileInput,旨在帮助开发者更好地理解和应用这一工具,提升项目的...

    FTP文件上传下载封装和调用.zip

    这个压缩包文件"FTP文件上传下载封装和调用.zip"包含了使用VC++开发的FTP功能的封装和调用示例,主要涉及到以下几个核心知识点: 1. FTP协议原理:FTP允许用户在两台计算机之间交换文件,通过命令和响应的交互完成...

    阿里云oss文件选择后自动上传Javascript封装;

    阿里云oss文件选择后自动上传Javascript封装; 如有不对请谅解。 原创不易转发请注明出处。

    php封装的单文件(图片)上传类.zip

    主要介绍了php封装的单文件(图片)上传类,结合完整实例形式分析了php图片文件上传操作的相关处理技巧,供朋友们学习参考。 参数1:$file 文件数组 5个属性值 name,type,size,tmp,error 参数2:文件保存的路径$path ...

    文件上传组件封装,支持多文件上传和拖拽上传

    本组件专注于实现“文件上传组件封装”,支持多文件上传和拖拽上传,旨在提高用户在上传文件时的便捷性和舒适性。在本文中,我们将深入探讨这个组件的核心技术和实现细节。 首先,组件的多文件上传功能是通过HTML5...

    ios-根据AFNetworking3.0框架封装的,实现了GET、POST、PUT、DELETE、上传文件、下载文件、文件上传下载进度条等功能.zip

    Network, 根据AFNetworking3.0框架封装的,实现了GET、POST、PUT、DELETE、上传文件、下载文件、文件上传下载进度条等功能,同时支持IPv6。 为什么使用它? 1、简单快捷,只需要一句代码即可请求网络和文件处理 ...

    okhttp3.0二次封装(独立的3个java文件封装的)

    支持get请求,post请求,支持文件上传和下载。 使用方法: 代码很简单,只有三个Java文件,建议下载后将Java文件拷贝到工程中使用。 封装的功能有: 一般的get请求 一般的post请求 一般的put请求 一般的...

    Java Spring文件上传,Java文件上传,Java通用文件上传

    在Java Spring框架中,文件上传是一项常见的功能,用于接收用户通过Web界面提交的文件。Spring提供了强大的MultipartFile接口,使得处理文件上传变得简单且高效。本文将深入探讨如何使用Java和Spring实现文件上传,...

    deb安装文件封装流程截图+文档

    用户可以将封装好的安装包双击安装,也可以上传至软件商店平台。 Deb 安装文件封装流程的优点 Deb 安装文件封装流程可以帮助用户快速、方便地将 Deb 安装包封装到本地计算机上。该流程可以节省时间和空间,提高...

    图片上传文件上传封装好了方法

    标题"图片上传文件上传封装好了方法"表明我们有一个已经完成的、优化过的代码实现,用于处理图片上传过程。这个过程通常涉及前端的交互、数据的传输以及后端的存储。下面将详细讨论图片上传的相关知识点。 1. **...

    ssh2(struts2+spring2.5+hibernate3.3+ajax)带进度条文件上传(封装成标签)

    标题 "ssh2(struts2+spring2.5+hibernate3.3+ajax)带进度条文件上传(封装成标签)" 涉及到的是一个基于Java Web的项目,利用了Struts2、Spring2.5、Hibernate3.3和Ajax技术,实现了文件上传并带有进度条显示的功能...

    ssh2(struts2+spring2.5+hibernate3.3+ajax)带进度条文件上传(封装成标签

    在这个项目中,SSH2框架与Ajax技术结合,实现了一个带进度条的文件上传功能,并且这个功能已经被封装成了自定义标签,方便在页面上直接使用。 首先,让我们深入理解SSH框架的每个组件: 1. **Struts2**:Struts2是...

    http下载和上传文件 c++ 封装类

    6. **进度反馈**:为了提升用户体验,CHttpClient可能提供文件上传和下载的进度回调接口,允许开发者更新UI或进行其他操作。 7. **多线程支持**:为了并发处理多个HTTP请求,类可能会支持多线程或异步操作,这样...

Global site tag (gtag.js) - Google Analytics