文件上传的实现

前端准备:


使用表单进行文件上传
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.使用表单子元素:`<input type="file" />

后台准备:


 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<FileItem> list = fileUpload .parseRequest( request)

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

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

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

文件上传

1.改servelt代码upload.jsp -> test
<form action = "UploadServlet" method="post" enctype="multipart/form-data">
    头像:<input type="file" name = "photo">
    姓名:<input type="text" name="name">
    <br>
    <input type="submit" value="上传" /> 提交表单submit reset重置 button普通按钮(需要绑定事件  )
</form>

UploadServlet.java
doPost(){
    DiskFileItem factory = new DiskFileItemFactory();
    Servlet fileUpload = new ServletFileUpload(factory);
    try{
        List<FileItem> 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

<form action = "UploadServlet" method="post" enctype="multipart/form-data">

    头像:<input type="file" name = "photo">

    姓名:<input type="text" name="name">

    <br>

    <input type="submit" value="上传" /> 提交表单submit reset重置 button普通按钮(需要绑定事件  )

</form>

UploadServlet.java

doPost(){

    DiskFileItem factory = new DiskFileItemFactory();

    Servlet fileUpload = new ServletFileUpload(factory);

    try{

        List<FileItem> 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> 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("-","");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值