当前位置: 首页 > news >正文

文件上传的实现

前端准备:


使用表单进行文件上传
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("-","");

相关文章:

  • rust每日一库 rand 生成随机数
  • 将对象转成URL参数
  • 网络编程相关面试题
  • 安装vmware_esxi 超详细
  • 什么是好的FPGA编码风格?(2)--多参考设计软件的语言模板(Language Templates)
  • 一文让你深入了解JavaSE的知识点
  • docker start一个容器之后,怎么进入这个容器界面
  • 米贸搜|Facebook海外企业户怎么引流到line上
  • 【开源视频联动物联网平台】视频接入网关的用法
  • Java第二十章多线程
  • Android自动化测试中使用ADB进行网络状态管理!
  • 游戏缺少d3dx9_43.dll修复方法分享,快速解决dll缺失问题
  • 浅学指针(3)
  • 宏定义中 ## 和 # 的作用
  • 中国信息通信研究院产业与规划研究所校招一面、二面内容
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • EOS是什么
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript实现分页效果
  • learning koa2.x
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • 浮动相关
  • 基于 Babel 的 npm 包最小化设置
  • 基于组件的设计工作流与界面抽象
  • 老板让我十分钟上手nx-admin
  • 普通函数和构造函数的区别
  • 全栈开发——Linux
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 新书推荐|Windows黑客编程技术详解
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Panda3d 碰撞检测系统介绍
  • # 透过事物看本质的能力怎么培养?
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • ()、[]、{}、(())、[[]]命令替换
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (南京观海微电子)——I3C协议介绍
  • (一)RocketMQ初步认识
  • (原)Matlab的svmtrain和svmclassify
  • .a文件和.so文件
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET CLR Hosting 简介
  • .Net 垃圾回收机制原理(二)
  • .NET连接数据库方式
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [ 第一章] JavaScript 简史
  • [AIGC] 使用Curl进行网络请求的常见用法