使用表单上传文件(二)

来源:互联网 发布:阿里云邮箱登录名忘记 编辑:程序博客网 时间:2024/06/06 10:55

先写一个简单的表单,根据上一篇文章说的步骤进行

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>    <form enctype="multipart/form-data" action="${pageContext.request.contextPath }/servlet/uploadServlet3" method="post">        <input type="text" name="info"></br>        <input type="file" name="files"></br>        <input type="file" name="photo"></br>        <input type="submit" value="提交">    </form></body></html>

接着写处理表单提交内容的uploadServlet3.java类

package coml.qianfeng.web.servlet;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadBase;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.apache.commons.io.FilenameUtils;import com.qianfeng.util.UUIDUtil;public class UploadServlet3 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //判断表单提交数据类型        boolean ismultipartForm = ServletFileUpload.isMultipartContent(request);        if(!ismultipartForm){            throw new RuntimeException("Your form's Content-Type is not multipart/form-data");        }        //创建工厂类对象        DiskFileItemFactory factory = new DiskFileItemFactory();        //设置临时文件的存放位置        factory.setRepository(new File("e:\\filestemp"));        //创建文件上传对象        ServletFileUpload fileUpload = new  ServletFileUpload(factory);        fileUpload.setHeaderEncoding("utf-8");//设置上传的中文乱码,而普通文本框中的中文乱码不能解决,可以在下面解决        //把表单提交过来的数据解析把每个数据封装成FileItem对象        try {            fileUpload.setFileSizeMax(1024*1024*3);//设置上传文件的大小不能超过3M            fileUpload.setSizeMax(1024*1024*5);//控制上传文件的总大小            //把表单提交过来的数据解析,把每个数据项封装成FileItem对象            List<FileItem  > fileItems = fileUpload.parseRequest(request);            //获取每项数据            for(FileItem item:fileItems){                //判断是否是普通的数据项                if(item.isFormField()){                    processFormField(item);                }else{                    processFileUpload(item);                }            }        }catch(FileUploadBase.SizeLimitExceededException e){            System.out.println("警告,上传文件的总大小不能超过5M");        }        catch(FileUploadBase.FileSizeLimitExceededException e){            System.out.println("警告,文件不能超过3M");        }         catch (Exception e) {            e.printStackTrace();        }    }    //处理普通表单项的方法    private void processFormField(FileItem item){        //得到名字        String name = item.getFieldName();        //得到值        String value="";        try {            value = item.getString("utf-8");//处理普通文本的中文乱码问题        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        System.out.println(name+"="+value);    }    //处理上传文件的方法    private void processFileUpload(FileItem item){        //得到上传的文件        String fileName = item.getName();        //在应用的目录下创建存储上传文件的目录        String storeDirectory = this.getServletContext().getRealPath("/WEB-INF/upload");        File realDirectory = new File(storeDirectory);        if(!realDirectory.exists()){            realDirectory.mkdirs();        }        try {            //读取文件的读取流            //InputStream in = item.getInputStream();            //String fileName = item.getName();ie浏览器:F:\pic\deng.jpg  火狐:deng.jpg  为了兼容处理一下文件名            //截取文件名            //fileName = fileName.substring(fileName.lastIndexOf(File.separator)+1);            fileName=FilenameUtils.getName(fileName);//使用工具类处理文件名            //处理文件同名问题            fileName = UUIDUtil.getUUID()+"_"+fileName;            //如果是大网站没听有很大的访问量,上传很多图片            //还需要处理把文件放在不同的文件夹下            //String childDirectory = getChildDirectory(realDirectory);            //如果每天的访问量都很大,同一天需要创建多个文件夹            String childDirectory = getChildDirectory2(realDirectory,fileName);//          File fileDir = new File(realDirectory,childDirectory+File.separator+fileName);//          FileOutputStream fos = new FileOutputStream(fileDir);//          实现把文件写入指定文件夹,同时有删除临时文件的功能,这一行可以代替下面注释的多行代码            item.write( new File(realDirectory,childDirectory+File.separator+fileName));//          byte[] arr = new byte[1024];//          int len=0;//          while((len=in.read(arr))!=-1){//              fos.write(arr,0,len);//          }//          //删除临时文件//          item.delete();//          in.close();//          fos.close();        } catch (Exception e) {        }    }    //创建子目录:用哈希值    private String getChildDirectory2(File realDirectory,String fileName) {        int hashCode = fileName.hashCode();        String code = Integer.toHexString(hashCode);//把哈希值转成十六进制        String childDirectory = code.charAt(0)+File.separator+code.charAt(1);//  a/b        File dir = new File(realDirectory,childDirectory);        if(!dir.exists()){            dir.mkdirs();        }        return childDirectory;    }    //创建子目录:用时间    private String getChildDirectory(File realDirectory) {        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");        Date date = new Date();        String time=sdf.format(date);        File dir = new File(realDirectory,time);        if(!dir.exists()){            dir.mkdirs();        }        return time;    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}
1 0
原创粉丝点击