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

直接上代码

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”)来得到正确的中文汉字"中".这样就既保证了遵守协议规定、也支持中文.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React 可以通过封装组件的方式来实现动态表单。以下是一个简单的例子: 1. 创建一个表单组件,接收一个数组作为参数,数组中包含表单项的配置信息,例如: ``` const formItems = [ { label: 'Username', name: 'username', type: 'text', required: true }, { label: 'Password', name: 'password', type: 'password', required: true }, { label: 'Email', name: 'email', type: 'email', required: false }, // ... ]; ``` 2. 在表单组件中,使用 map 方法遍历表单项配置数组,根据每个配置项的信息生成对应的表单控件。 ``` function DynamicForm({ formItems }) { const [formValues, setFormValues] = useState({}); function handleChange(e) { setFormValues({ ...formValues, [e.target.name]: e.target.value }); } function handleSubmit(e) { e.preventDefault(); // 处理表单提交逻辑 } return ( <form onSubmit={handleSubmit}> {formItems.map(item => ( <div key={item.name}> <label>{item.label}</label> <input type={item.type} name={item.name} value={formValues[item.name] || ''} required={item.required} onChange={handleChange} /> </div> ))} <button type="submit">Submit</button> </form> ); } ``` 3. 在父组件中调用动态表单组件,并传入表单项配置数组作为参数。 ``` function App() { const formItems = [ // 表单项配置信息 ]; return ( <div className="App"> <DynamicForm formItems={formItems} /> </div> ); } ``` 以上就是一个简单的动态表单封装示例,可以根据需求调整表单项配置信息和表单控件的样式等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值