文件上传的实现

前端准备:


使用表单进行文件上传
1. form的method属性提交方式: post

2. form 的enctype属性:

enctype的默认值: application/x-www-form-urlencoded对表单数据进行url编码->对文本进行编码 

中:(UTF-8)占3个字节-> url编码:每一个字节变成: %两位十六进制

类似于这种形式:%17%AB%E7

multipart/form-data->多部件表单数据 针对文件

3.使用表单子元素:`

后台准备:


 1.添加jar包 添加commons-fileupload.jar: commons-io.jar 到web-inf里面的lib

2.编写servlet来接收前端请求 前端有请求参数 现在还是用request.getParameter来接收吗?

如果我们的表单enctype设置为'multipart/form-data',此时request.getParamter()这一类方法都失效,获取不到请求参数

获取请求参数借助导入commos-fileUpload代码

commos-fileUpload编码的步骤:

1.创建解析器工程对象:DiskFileltemFactory ->直接new

DiskFileItemFactory factory = new DiskFileItemFactory()

2.根据Fileltem工厂对象得到解析器: ServletFileUpload

 ServletFileUpload fileUpload = new ServletFileUpload(factory)

3.使用解析器来解析request对象,得到Fileltem集合

List list = fileUpload .parseRequest( request)

Fileltem:表单项,就是前端form表单中表单子元素: input.selected,textarea等等

分类:文件域(type=file),非文件域(普通表单子元素)

遍历Fileltem集合,得到每一个Fileltem,判断是否是文件域还是非文件域,如果文件域进行文件上传,非文件域:得到value

文件上传

1.改servelt代码upload.jsp -> test
头像: 姓名:
提交表单submit reset重置 button普通按钮(需要绑定事件 )
UploadServlet.java doPost(){ DiskFileItem factory = new DiskFileItemFactory(); Servlet fileUpload = new ServletFileUpload(factory); try{ List fileItem = fileUpload.parseRequest(request); for(FileItem fileItem : fileItems){ //判断是否是文件域isFormField()返回true表示普通表单项 false则是文件域 sout(fileItem.isFormField()); if(fileItem.isFormField()){ //获取请求参数名 getFieldName() 请求参数值 getString(String encoding) sout("参数名:" + fileItme.getFieldName() + ",值:" + fileItem.getString("UTF-8")); }else{ //获得提交过来的文件的文件名 sout("上传的文件名:" + fileItem.getName()); } } }catch(fileUploadException e){ e.printStackTrace(); } }

适应IO流的替换,->void write(File file) throw Exception;封装了这个适应IO流的实现code

文件上传

1.改servelt代码upload.jsp -> test

    头像:

    姓名:

   

    提交表单submit reset重置 button普通按钮(需要绑定事件  )

UploadServlet.java

doPost(){

    DiskFileItem factory = new DiskFileItemFactory();

    Servlet fileUpload = new ServletFileUpload(factory);

    try{

        List fileItem = fileUpload.parseRequest(request);

        for(FileItem fileItem : fileItems){

            //判断是否是文件域isFormField()返回true表示普通表单项 false则是文件域

            sout(fileItem.isFormField());

            if(fileItem.isFormField()){

                //获取请求参数名 getFieldName() 请求参数值 getString(String encoding)

                sout("参数名:" + fileItme.getFieldName() + ",值:" + fileItem.getString("UTF-8"));

            }else{

                //获得提交过来的文件的文件名

                sout("上传的文件名:" + fileItem.getName());

                //上传文件

                File savePathfile = new File("D:\\StorFileDir");//保存路径

                //判断文件夹是否存在

                if(!savePathfile.exits()){//不存在   ->防止文件夹不存在

                    savefile.mkdirs();

                }

                File savefile = new File(savePathfile,fileItem.getName());

                fileItem.write(savefile);

            }

        }

    }catch(fileUploadException e){

        e.printStackTrace();

    }catch(Exception e){

        e.printStackTrace();

    }

}

有个问题?上传的名字冲突问题

/使用客户端上传的文件名作为服务器保存的文件名,可能多个客户端使用相同名字,造成覆盖文件

//需要你实现服务器自动生成不重复的文件名

服务器自动生成不重复的文件名 时间戳(毫秒)+区分名  java的工具类:可以随机生成UUID 是一个算法 或者使用雪花算法

long time = System.currentTimeMillis();

//加上后缀名  要求后缀名与上传的文件名的后缀名是一样的  xxx.jpg

String fileName = fileItem.getItem();

String suffix = fileName.substring(fileName.lastIndexOf("."));

File savefile = new File(savePathfile,time+suffix);

UploadServlet.java

doPost(){

    DiskFileItem factory = new DiskFileItemFactory();

    Servlet fileUpload = new ServletFileUpload(factory);

    try{

        List fileItem = fileUpload.parseRequest(request);

        for(FileItem fileItem : fileItems){

            //判断是否是文件域isFormField()返回true表示普通表单项 false则是文件域

            sout(fileItem.isFormField());

            if(fileItem.isFormField()){

                //获取请求参数名 getFieldName() 请求参数值 getString(String encoding)

                sout("参数名:" + fileItme.getFieldName() + ",值:" + fileItem.getString("UTF-8"));

            }else{

                //获得提交过来的文件的文件名

                sout("上传的文件名:" + fileItem.getName());

                //上传文件

                File savePathfile = new File("D:\\StorFileDir");//保存路径

                //判断文件夹是否存在

                if(!savePathfile.exits()){//不存在   ->防止文件夹不存在

                    savefile.mkdirs();

                }

                long time = System.currentTimeMillis();

                //加上后缀名  要求后缀名与上传的文件名的后缀名是一样的  xxx.jpg

                String fileName = fileItem.getItem();

                String suffix = fileName.substring(fileName.lastIndexOf("."));

                File savefile = new File(savePathfile,fileItem.getName());

                fileItem.write(savefile);

            }

        }

    }catch(fileUploadException e){

        e.printStackTrace();

    }catch(Exception e){

        e.printStackTrace();

    }

}

第二种:UUID的方式

String time = UUID.randomUUID().toString();//生成小写加-分割

String fileName = fileItem.getName();

String suffix = fileName.subString(fileName.lastindexOf(".));

File saveFile = new File(savePathFile,time+suffix);

fileItem.write(saveFile);

优化:去掉-

String time = UUID.randomUUID().toString().toUpperCaea().replace("-","");

你可能感兴趣的:(JacaEE,java)