JAVA中文件上传的实例

  1. 导包
     向项目中的WEB-INF下的lib目录中导入下面两个包:commons-fileupload.jar包和commons-io.jar包
  2. 编写上传servlet代码。
public class UploadServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    //获取部署在tomcat下的路径目录。
    File file = new File (this.getServletContext().getRealPath("/tempfile"));
    //如果该目录不存在,我们应该自己创建该目录。
    if(!file.exists())
        file.mkdirs();
    //创建文件项工厂对象,设置缓冲区大小和临时文件位置。
    DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024,file);

    //创建指定缓冲区和临时文件位置的ServletFileUpload对象
    ServletFileUpload upload = new ServletFileUpload(factory);
    //判断请求是否为文件上传模式。
    if(ServletFileUpload.isMultipartContent(request)){
        //使用自己指定的编码编码信息。Tomcat默认的编码是为"ISO-8859-1",防止出现上传文件名称乱码的问题。
        upload.setHeaderEncoding("UTF-8");
        //这里可以设文件上传大小上限。也可以不设置。参数单位为Byte
        //upload.setSizeMax(1024*1024*5);

        //解析request,得到所有上传项目的数据。该方法有异常,可以选择进行处理或者声明异常。
        List<FileItem> items = upload.parseRequest(request);
        //遍历List集合,对上传项目进行判断,根据情况进行处理。
        for(FileItem item:items){
            //判断是否是上传项目是否在表单直接提交数据的范围
            if(item.isFormField()){
                //表单直接携带的数据,既:非文件上传的组件。
                String fieldname = item.getFieldName();//获取组件名称
                String content = item.getString("UTF-8");//获取组件的内容,传入UTF-8,是为了保证和上面设置的编码一样,防止出现乱码问题。
                //根据自己的实际情况需求做操作。
            }else{
                //组件为文件上传,为了防止代码太乱,将一些功能封装到自定义工具类中,工具类等下介绍。
                //获取上传文件的名字
                String name = item.getName();
                String filename = FileUploadUtils.getRealName(name);
                //给文件起个随机名字。
                String uuidname = FileUploadUtils.getUUIDFileName(filename);
                //获取散列目录
                String hashDirectory=FileUploadUtils.getHashDirectory(filename);
                //存放散列目录的父目录,在该案例中,设父目录名称为upload
                String parentPath =this.getServletContext().getRealPath("/upload");
                File hd = new File(parentPath,hashDirectory);
                //判断目录是否存在,不存在则创建。
                if(!hd.exists)
                    hd.mkdirs();
                //调用commons-io包中的工具
                IOUtils.copy(item.getInputStream(),new FileOutputStream(new File(hd,uuidname)));
                //删除临时文件。
                item.delete();
            }
        }
    }else{
        //执行非文件上传请求操作
        response.getWrite().write("这不是上传请求");
        return;
    }

}
  1. 自定义上传工具类。
public class FileUploadUtils {
    //获取文件的名称。
    public static String getRealName(String filename){
        int index = filename.lastIndexOf("\\")+1;
        return filename.substring(index);
    }

    //获取随机名称
    public static String getUUIDFileName(String filename){
        int index = filename.indexOf(".");
        if(index!=-1)
            return UUID.randomUUID()+filename.substring(index);
        else
            return UUID.randomUUID().toString();
    }

    //通过散列目录算法,得到散列目录。
    public static String getHashDirectory(String filename){
        int hashcode = filename.hashCode();
        int a = hashcode & 0xf;
        hashcode = hashcode>>>4;
        int b = hashcode & 0xf;

        return "/"+a+"/"+b;
    }

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值