javaweb中的文件上传处理

1.
需要的驱动包。
com.commons.fileuplooad-1.2.1.jar
com.commons.io-1.3.2.jar
 
版本有点老,其中一个包的 parseRequest();方法在报过时。
 
//获得一个工厂对象,它会初始化一些参数。不知道里边干什么的。
DeskFileItemFactory dff = new org.apache.commons.fileupload.disk();
 
//获取处理对象
FileUpload fu = new FileUpload(dff);
//限制所有文件大小
fu.setMaxFile( 10 * 1024 * 1024 );
//限制单个文件大小
fu.setFileMaxFile( 1 * 1024 * 1024);
//这个不知道在干嘛。。
fu.setHeaderEncoding("UTF-8");
 
 
List<FileItem> lists = fu.parseRequest(javax.servlet.HttpServletRequest.req);
 
for(FilItem fi : lists){
    if(fi.isField ){
   //如果是普通控件
       if(fi.getFiledName() != null){
            //1.处理乱码
            name = new String(fi.getString.getByte("ISO-8859-1"),"UTF-8")
       }
    
    }else{
   //上传文件
      
      if(fi.getString()==null || fi.getString().equals(""))
          continue;
      String path = req.getServletContent().getRealPath("Image");
      //2.得到图片在客户端的路径
      String headImage = req.getName();
      //3.截取掉盘符,只保留文件名
      String str[] = headImage.split("\\\\");
      headImage = str[str.length];
      path += "\\"+headImage;
 
      InputStream is = req.getInputStream();
      OutputStream os = new FileOutputStream(new File(path));
      byte b = new byte[1024];
      int i;
      while((i=is.read(b))>-1){
          os.write(b,0,i);
      }
      os.close();
      is.close();
//4.剪贴传入文件相对于项目的路径
headImage = path.substring(path.indexOf("jsp")-1);
headImage = headImage.replaceAll("\\\\", "/");
    }
}
 
//遇到几个问题
0.
  0.1为什么使用这个类
        在Html的表单提交方式中,我们明确指明了使用 enctype="multipart/form-data"
        这是一个支持使用2进制方式传输数据的编码
  0.2使用这种方式接受到的文件 不能使用request.getParameter("name");获取参数。
      这就意味着我们必须使用for_ecth FileItem if(fi.getFiledName().equals("name")){}来获取每个值。
 
1.处理乱码
  草为什么要处理乱码?拦截器,直接request.setCharacterEncoding("UTF-8")不行吗?
  还真的不行,你必须得了解当前的形式,比如传说中的ISO-8859-1那家伙规定的标准。
  它说:我们的标准是最节约内存,不会浪费一丝一毫的流损耗。我们是单字节,向下兼容ASCLL码的一个编码   标准。确实很牛逼!所以我们得做如下操作,才能得到我们喜欢看到的汉字
  String name = new String((fi.getString().getByte("ISO-8859-1"),"UTF-8"))
 
2.客户端上传图片的路径
  通过IE内核与火狐内核得到的上传文件路径的全程,也就是说,包括电脑盘符:如:D://program//yellow.jpg,所以你希望得到文件名,然后拼接成服务器上面的绝对文件路径,就必须得截取签名的盘符及文件目录。
 
  通过Google内核得到的是文件的直接名称:yellow.jpg 所以就不需要截取了。
 
3.
4. 资源分隔符,基础差了果然吃亏,这玩意搞掉我至少有3个小时。同学们,我就分享给你们拉。
"/" 文件目录分隔,通常linux, unix使用,当然 Widows也支持,注意观察网页中,都是使用的它。
"\\" 文件夹分隔,通常用于Windows。 就作用而言 "\\"="/"
需要很,需要注意的是:
"\"是转义符的意思
new String("\\") =  表现上的:"\"
在Windows文件目录分隔时,我们都打了2个"\" "\\"进行文件分隔
但他们在Java的内部比较的时候是怎么搞的呢?
"\\\\"=我们看到的"\\"
但是"\\"在编码又="\"
所以在替换与剪接的时候,它是把转义符也算上了
"f\\f\\f\\f".split("\\\\").length = 4
posted @ 2015-07-03 14:13  吃土豆长大的孩子  阅读(135)  评论(0)    收藏  举报