关于common fileUpload 接收非文件的参数和中文乱码的问题
最近的项目中要用到commonfileUpload 在接收参数时出现了中文乱码,在这里我记录一下,以供后来的人可以少走这个弯路。由于在网上找到的文章好多都是转载的,所以解决这个问题也用了我一个上午的时间。
这里贴出一部分的代码
代码中的一些变量没有定义的是在try{}catch(){}以外定义的。代码中有些不严谨的地方,我并没有修改
- try{
- StringregExp=".+////(.+)$";//正则匹配,去掉路径取文件名.
- Stringerrortype[]={".exe",".com",".cgi",".asp"};
- Patternp=Pattern.compile(regExp);
- StringuploadPath="D:/image"; //这里我用的是绝对路径,这里可以在web.xml中配置,如果一定要用绝对路径的话
- booleanisMultipart=FileUploadBase.isMultipartContent(request);
- DiskFileItemFactoryfactory=newDiskFileItemFactory();
- factory.setSizeThreshold(1024);
- ServletFileUploadupload=newServletFileUpload(factory);
- upload.setSizeMax(1024*1024);
- upload.setHeaderEncoding("gb2312"); //这里要设置一下,设置成你需要的格式
- List<FileItem>fileItem=upload.parseRequest(request);
- Iterator<FileItem>it=fileItem.iterator();
- while(it.hasNext()){
- FileItemfi=it.next();
- StringoriFileName=fi.getName();
- if(fi.isFormField()){ //在这里判断一下,是否要接收非文件的参数,这里接收的非文件的参数
- StringformName=fi.getFieldName();
- StringformContent=fi.getString();
- formName=newString(formName.getBytes(),"gb2312");//这一句似乎不用也行,没测试
- formContent=newString(formContent.getBytes(),"gb2312");//这一句也没有测试,好象不用也行
- if(formName.equalsIgnoreCase("categoryId")){
- categoryId=Integer.parseInt(formContent);
- }elseif(formName.equalsIgnoreCase("goodsName")){
- goodsName=formContent;
- }elseif(formName.equalsIgnoreCase("price")){
- price=Float.parseFloat(formContent);
- }elseif(formName.equalsIgnoreCase("salePrice")){
- salePrice=Float.parseFloat(formContent);
- }elseif(formName.equalsIgnoreCase("description")){
- description=formContent;
- }elseif(formName.equalsIgnoreCase("isExist")){
- isExist=Integer.parseInt(formContent);
- }
- }
- else{//这里接收的是文件的参数。
- if(!fi.isFormField()&&(oriFileName!=null)){
- Matcherm=p.matcher(oriFileName);
- booleanresult=m.find();
- if(result){
- for(inti=0;i<errortype.length;i++){
- if(m.group(1).endsWith(errortype[i])){
- thrownewIOException(oriFileName
- +"wrongtype");
- }
- }
- try{
- fi.write(newFile(uploadPath+"/"
- +m.group(1)));
- path=uploadPath+"/"+m.group(1); //这个path是我在try{}catch(){}以外定义的,以便得到这个值存入数据库
- System.out.println("上传成功");
- }catch(Exceptiones){
- es.printStackTrace();
- }
- }
- }
- }
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
上面的方法可以接收正确的中文,也可以接收非文件域的参数
如果是大量的用到文件上传的话也可以把这个功能单独写到一个类里,以便调用。下面我贴出一个别人写好的类。
如果要用,这个可以做个参考,直接拿来用不是个好的学习习惯。
- packagecom.flc.util;
- importjava.util.*;
- importjava.io.*;
- importjavax.servlet.http.*;
- importorg.apache.commons.fileupload.*;
- publicclassJakartaFileUploadHandler{
- privateMapfileFields=newTreeMap();
- privateMapformFields=newTreeMap();
- privatebooleanisMultipart=false;
- privateHttpServletRequestrequest=null;
- publicJakartaFileUploadHandler(){
- }
- publicJakartaFileUploadHandler(HttpServletRequestrequest){
- setRequest(request);
- }
- publicvoidsetRequest(HttpServletRequestrequest){
- this.request=request;
- isMultipart=FileUpload.isMultipartContent(request);//如果是文件上传请求,
- //就提取里面的参数
- if(isMultipart){
- //Createanewfileuploadhandler
- DiskFileUploadupload=newDiskFileUpload();
- try{
- //Parsetherequest
- Listitems=upload.parseRequest(request);
- //Processtheuploadeditems
- Iteratoriter=items.iterator();
- while(iter.hasNext()){
- FileItemitem=(FileItem)iter.next();
- Stringname=item.getFieldName();
- Stringvalue=item.getString();
- if(item.isFormField()){
- processFormField(item);
- }else{
- processUploadedFile(item);
- }
- }
- }catch(Exceptionex){
- System.err.println("无法处理上传数据:"+ex);
- }
- }
- }
- privatevoidprocessFormField(FileItemitem){
- Stringname=item.getFieldName();
- Stringvalue=item.getString();//首先尝试获取原来的值
- ObjectoldValue=formFields.get(name);
- if(oldValue==null){
- formFields.put(name,value);
- }else{
- //多个值存储为List//原来为单个值则添加现有的值
- try{
- StringoldString=(String)oldValue;
- Listlist=newArrayList();
- list.add(oldString);
- list.add(value);
- formFields.put(name,list);
- }catch(Exceptionex){
- ex.printStackTrace();
- }
- //原来为多个值则添加现有的值
- try{
- Listlist=(List)oldValue;
- list.add(value);
- formFields.put(name,list);
- }catch(Exceptionex){//
- ex.printStackTrace();
- }
- }
- }
- privatevoidprocessUploadedFile(FileItemitem){
- Stringname=item.getFieldName();
- fileFields.put(name,item);
- }
- }