把带附件的form表单封装到map里

版权声明:网上学习笔记,共享。 https://blog.csdn.net/qq_37346607/article/details/84826037

直接上代码

private void DataformMap(ServletRequest request1, ServletResponse response1) throws ServletException, IOException, FileUploadException{
		HashMap PARA_MAP = new HashMap(); 
		 HttpServletRequest request = (HttpServletRequest)request1;
		 HttpServletResponse response = (HttpServletResponse)response1;
		
		String filePath = Constant.filePath;
		long MAX_SIZE = Integer.parseInt(this.getService().getSize())*1024*1024;// 设置上传文件最大为 3M
		if(filePath==null || "".equals(filePath)){
			Constant.filePath="c:\\filePath";
			filePath= "c:\\filePath";
		}
		if(MAX_SIZE==0){
			MAX_SIZE=3*1024*1024;
		}
		// 允许上传的文件格式的列表
		final String[] allowedExt = new String[] { "jpg", "jpeg", "gif", "txt",
				"doc", "docx", "mp3", "wma", "m4a", "rar" };
		response.setContentType("text/html");
		// 设置字符编码为UTF-8, 这样支持汉字显示,而不是用默认的ISO8859
		response.setCharacterEncoding("UTF-8");
		// 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
		DiskFileItemFactory dfif = new DiskFileItemFactory();
		dfif.setSizeThreshold(4096);// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
		File upLoadFilePath = new File(filePath);
		if(!upLoadFilePath.exists()){upLoadFilePath.mkdir();}
		dfif.setRepository(upLoadFilePath);//  设置存放临时文件的目录,web根目录下的ImagesUploadTemp目录
		PrintWriter out =null;
		List upLoadFileList = new ArrayList();
		// 用以上工厂实例化上传组件
		ServletFileUpload sfu = new ServletFileUpload(dfif);
		// 设置最大上传尺寸
		sfu.setSizeMax(MAX_SIZE);		
		// 从request得到 所有 上传域的列表
		List fileList = null;
		fileList = sfu.parseRequest(request);		
		// 没有文件上传
		if (fileList == null || fileList.size() == 0) {
			return;
		}
		// 得到所有上传的文件
		Iterator fileItr = fileList.iterator();
		// 循环处理所有文件
		while (fileItr.hasNext()) {
			String path = null;
			FileItem fileItem = null;
			long size = 0;
			fileItem = (FileItem) fileItr.next();
			// sFormField(): 判断FileItem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,如果是普通表单字段则返回true,否则返回false。因此,可以使用该方法判断是否为普通表单域,还是文件上传表单域。
			if (fileItem!=null && fileItem.isFormField()) {
				String tmpParaName = fileItem.getFieldName();
				// UTF-8(之前设置的读取中文文件名)转成ISO-8859-1(http默认编码)后转成GBK(这是我项目的编码)
				String nmsValue = new String ((StringUtil.changeNull(fileItem.getString())).getBytes("ISO-8859-1"),"GBK");
				// 转义字符 防止xxs攻击
				nmsValue = nmsValue.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
				nmsValue = nmsValue.replaceAll("\\(", "&#40;").replaceAll("\\)", "&#41;");
				nmsValue = nmsValue.replaceAll("'", "&#39;");
				nmsValue = nmsValue.replaceAll("eval\\((.*)\\)", "");
				nmsValue = nmsValue.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
				nmsValue = nmsValue.replaceAll("alert%", "");
				PARA_MAP.put(tmpParaName, nmsValue);
				continue;
			}
			Map map = new HashMap();
			// 得到文件的完整路径
			path = fileItem.getName();
			// 得到文件的大小
			size = fileItem.getSize();
			if ("".equals(path) || size == 0) {
				continue;
			}
			// 得到去除路径的文件名
			String t_name = path.substring(path.lastIndexOf("\\") + 1);
			// 得到文件的扩展名(无扩展名时将得到全名)
			String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1);
			// 拒绝接受规定文件格式之外的文件类型
			String bj=fileItem.getFieldName();
			//文件类型暂不做限制
//			int allowFlag = 0;
//			int allowedExtCount = allowedExt.length;
//			for (; allowFlag < allowedExtCount; allowFlag++) {
//				if (allowedExt[allowFlag].equals(t_ext))
//					break;
//			}
//			if (allowFlag == allowedExtCount) {
//				RequestDispatcher rd=config.getServletContext().getRequestDispatcher(request.getContextPath()+"/error.html?error=0");
//				rd.forward(request,response);
//				return ;
//			}
			if("GIF".equalsIgnoreCase(t_ext) || "JPG".equalsIgnoreCase(t_ext) || "jpeg".equalsIgnoreCase(t_ext) || "bmp".equalsIgnoreCase(t_ext) ){
				map.put("ISPICTURE", "Y");
			}else{
				map.put("ISPICTURE", "N");
			}
			map.put("BJ", bj);
			map.put("FILETYPE", t_ext);
			map.put("FILENAME", t_name);
			map.put("fileItem", fileItem);
			upLoadFileList.add(map);
		}
	    String ip=request.getRemoteAddr();
	    PARA_MAP.put("IP", ip);
	    PARA_MAP.put(ConstVal.UPLOAD_FILE_LIST, upLoadFileList);
	    request.setAttribute("PARA_MAP", PARA_MAP);
	}

解释1:有时候,为了让中文字符适应某些特殊要求(如http header头要求其内容必须为iso8859-1编码),可能会通过将中文字符按照字节方式来编码的情况,如:
String s_iso88591 = new String(“中”.getBytes(“UTF-8”),“ISO8859-1”),这样得到的s_iso8859-1字符串实际是三个在ISO8859-1中的字符,在将这些字符传递到目的地后,目的地程序再通过相反的方式String s_utf8 = new String(s_iso88591.getBytes(“ISO8859-1”),“UTF-8”)来得到正确的中文汉字"中".这样就既保证了遵守协议规定、也支持中文.

猜你喜欢

转载自blog.csdn.net/qq_37346607/article/details/84826037