他能帮我们减少了数据库服务器的压力,对数据的操作更加灵活。

  所谓的文件上传就是服务器端通过request对象获取输入流,将浏览器端上传的数据读取出来,保存到服务器端。

  在使用文件上传的时候,我们应该注意两个事项,浏览器端和服务器端的一些注意事项。

  浏览器端的事项

     首先一个form表单,他的method请求方式必须是post请求,而且必须设置属性encType=”multipart/form-data”。当然,表单里面肯定要有个文件上传控件也就是

<input type="file" name="xxx">注意name属性一定要有且必须要有值,这就是上传前浏览器端的注意事项。

服务器端的事项

      request.getParameters()获取不到上传控件的参数,这里我们要使用

Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload ),下载地址点击打开链接,导入jar包后,创建DiskFileItemFactory,创建ServletFileUpload,通过ServletFileUpload的parseRequest方法得到所有的FileItem

具体步骤如下

                 

//创建磁盘文件项工厂
		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
		
		//创建一个核心文件上传对象
		ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
		
		try {
			//解析请求,获取所有上传组件
			List<FileItem> list= fileUpload.parseRequest(request);
			
			//获取每一个文件项
			for (FileItem fileItem : list) {
				//判断是否为普通组件
				if(fileItem.isFormField()){
					//是
					//获取组件的的name值
					String fieldName = fileItem.getFieldName();
					//获取value 其中getString为获取普通组件的值并以utf-8编码接收
					String value = fileItem.getString("utf-8");
				}else{
					//不是
					//获取文件名
					String filename = fileItem.getName();
					//获取真实名称
					String realName = UploadUtils.getRealName(filename);
					//获取随机的文件名
					String uuidName = UploadUtils.getUUIDName(realName);
					//获取文件流
					InputStream in = fileItem.getInputStream();
					//获取服务器存储路径
					String realPath = this.getServletContext().getRealPath("/products/1");
					//创建输出流
					FileOutputStream fos = new FileOutputStream(new File(realPath, uuidName));
					//拷贝
					IOUtils.copy(in, fos);
					
					fos.close();
					in.close();
					fileItem.delete();
					
					
				}
			}





  为了防止文件名重复,我们创建了一个工具类UploadUtils,这个工具类可以直接拿来使用

public class UploadUtils {
	/**
	 * 获取随机名称
	 * @param realName 真实名称
	 * @return uuid
	 */
	public static String getUUIDName(String realName){
		//realname  可能是  1.jpg   也可能是  1
		//获取后缀名
		int index = realName.lastIndexOf(".");
		if(index==-1){
			return UUID.randomUUID().toString().replace("-", "").toUpperCase();
		}else{
			return UUID.randomUUID().toString().replace("-", "").toUpperCase()+realName.substring(index);
		}
	}
	
	/**
	 * 获取文件真实名称
	 * @param name
	 * @return
	 */
	public static String getRealName(String name){
		// c:/upload/1.jpg    1.jpg
		//获取最后一个"/"
		int index = name.lastIndexOf("\\");
		return name.substring(index+1);
	}
	
	/**
	 * 获取文件目录
	 * @param name 文件名称
	 * @return 目录
	 */
	public static String getDir(String name){
		int i = name.hashCode();
		String hex = Integer.toHexString(i);
		int j=hex.length();
		for(int k=0;k<8-j;k++){
			hex="0"+hex;
		}
		return "/"+hex.charAt(0)+"/"+hex.charAt(1);
	}
	
}