直接上代码
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("<", "<").replaceAll(">", ">");
nmsValue = nmsValue.replaceAll("\\(", "(").replaceAll("\\)", ")");
nmsValue = nmsValue.replaceAll("'", "'");
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”)来得到正确的中文汉字"中".这样就既保证了遵守协议规定、也支持中文.