一、文件上传准备工作

对于文件上传,浏览器在上传的过程中将文件以流的形式提交到服务器。
可以选择apache的commons-fileupload包作为文件上传组件,commons-fileupload包依赖于commons-io包。
可以在Maven导入该commons-fileupload包,Maven会帮我们导入依赖的jar包commons-io。

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version>
</dependency>

二、文件上传的主要步骤

创建diskFileItemFactory对象,处理文件上传路径或者大小限制
通过diskFileItemFactory对象作为ServletFileUpload类的参数,创建ServletFileUpload对象
处理上传的文件
三、代码实现
在文件上传时,表单一定要加enctype=“multipart/form-data” 。只有使用enctype=“multipart/form-data”,表单才会把文件的内容编码到HTML请求中。
默认enctype=“application/x-www-form-urlencoded”,表单的内容会按URL规则编码。
而enctype="multipart/form-data"不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。method也一定要使用post请求。因为get请求会有大小的限制。

<form action="/file.do" enctype="multipart/form-data" method="post"><p>上传用户:<input type="text" name="username"></p><p><input type="file" name="file1"></p><p><input type="file" name="file2"></p><p><input type="submit">|<input type="reset"></p>
</form>

定义一个类去继承HttpServlet类在doPost方法里面实现功能

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//判断上传的是普通表单还是带文件的表单if (!ServletFileUpload.isMultipartContent(req)) {return;}//创建上传文件保存的地址,一般创建在WEB-INF目录下,用户无法直接访问该目录下的文件String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");File uploadFile = new File(uploadPath);//如果文件夹不存在,则创建一个if (!uploadFile.exists()) {uploadFile.mkdir();}//创建上传大文件的临时地址,一般几天后自动删除,用户可以手动删除或者转为永久文件// 一般创建在WEB-INF目录下,用户无法直接访问该目录下的文件String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");File tempFile = new File(tempPath);//如果文件夹不存在,则创建一个if (!tempFile.exists()) {tempFile.mkdir();}//1.创建diskFileItemFactory对象,处理文件上传路径或者大小限制DiskFileItemFactory factory = getDiskFileItemFactory(tempFile);//2.获取ServletFileUploadServletFileUpload upload = getServletFileUpload(factory);//3.处理上传的文件try {String msg = uploadParseRequest(upload, req, uploadPath);//转发req.setAttribute("msg",msg);req.getRequestDispatcher("info.jsp").forward(req, resp);} catch (FileUploadException e) {e.printStackTrace();}}public DiskFileItemFactory getDiskFileItemFactory(File file) {DiskFileItemFactory factory = new DiskFileItemFactory();//创建一个缓存区,当上传文件大于设置的缓存区时,将该文件放到临时目录factory.setSizeThreshold(1024 * 1024);//缓存区大小为1Mfactory.setRepository(file);//临时目录return factory;}public ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {ServletFileUpload upload = new ServletFileUpload(factory);//监听文件上传进度upload.setProgressListener(new ProgressListener() {@Overridepublic void update(long uploaded, long totalSize, int i) {System.out.println("已上传:"+(uploaded*100)/totalSize+"%");}});upload.setHeaderEncoding("UTF-8");//乱码处理upload.setFileSizeMax(1024 * 1024 * 10);//设置单个文件的最大值10Mupload.setSizeMax(1024 * 1024 * 100);//设置总共能上传文件的最大值100Mreturn upload;}public String uploadParseRequest(ServletFileUpload upload, HttpServletRequest req, String uploadPath) throws FileUploadException, IOException {String msg = "";//把前端请求解析,封装成一个List对象List<FileItem> fileItems = upload.parseRequest(req);for (FileItem fileItem : fileItems) {if (fileItem.isFormField()) {//判断上传的文件是普通的表单还是带文件的表单String name = fileItem.getName();//前端表单控件的name:usernameString value = fileItem.getString("UTF-8");//乱码处理System.out.println(name + ":" + value);} else {//判断为上传的文件//==================处理文件=====================String uploadFileName = fileItem.getName();//前端表单控件的nameSystem.out.println("上传的文件名:" + uploadFileName);if (uploadFileName.trim().equals("") || uploadFileName == null) {//可能存在不合法的情况continue;}String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);//文件名String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);//文件后缀名System.out.println("文件名:" + fileName + "--文件后缀:" + fileExtName);//==================存放地址==================String uuidPath = UUID.randomUUID().toString();//文件存储的真实路径String realPath = uploadPath + "/" + uuidPath;System.out.println("文件上传到的位置:"+realPath);//给每个文件创建一个文件夹File realPathFile = new File(realPath);if (!realPathFile.exists()) {//如果文件夹不存在,则创建一个realPathFile.mkdir();}//==================文件传输==================//获得文件上传的流InputStream inputStream = fileItem.getInputStream();//创建一个文件输出流FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName);//创建一个缓冲区byte[] buffer = new byte[1024 * 1024];//判断读取是否完毕int len = 0;while ((len = inputStream.read(buffer)) > 0) {fileOutputStream.write(buffer, 0, len);}//关闭流fileOutputStream.close();inputStream.close();msg = "上传成功";fileItem.delete();//上传成功,清除临时文件}}return msg;
}

文件上传的注意事项

1、为保证服务器安全,上传的文件应该放在外界无法直接访问的目录下,例如放在WEB-INF目录下。
2、为了防止文件覆盖的现象,要为上传的文件产生一个唯一的文件名(可以为每一个上传的文件增加一个uuid或时间戳为名的文件夹)
3、限制上传文件的最大值
4、限制上传文件的类型,在收到上传文件时,判断其后缀名是否合法,是否为自己限制的类型

java实现文件上传功能详解相关推荐

  1. java formfile_基于Struts文件上传(FormFile)详解

    Struts中FormFile用于文件进行上传 1.在jsp文件中进行定义 名字: 头像: 2.在Form表单中定义FormFile /* * Generated by MyEclipse Strut ...

  2. Pikachu靶场之文件上传漏洞详解

    Pikachu靶场之文件上传漏洞详解 前言 文件上传漏洞简述 什么是文件上传漏洞? 文件上传的原理 文件上传漏洞有哪些危害 文件上传漏洞如何查找及判断 文件上传如何防御 文件上传漏洞绕过的方式有哪些 ...

  3. 【网络安全】文件上传漏洞 详解

    文件上传漏洞 1.什么是文件上传 将客户端数据以文件形式封装,通过网络协议发送到服务器端.在服务器端解析数据,最终在服务端硬盘上作为真实的文件保存. 通常一个文件以HTTP协议进行上传时,将POST请 ...

  4. java web文件上传详解_java web图片上传和文件上传实例详解

    java web图片上传和文件上传 图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多,但底层的实现都是文件的读写操作. 注意事项 1.form表单一定 ...

  5. php文件上传详解,PHP文件上传实例详解!!!

    这篇文章主要介绍了PHP文件上传实例代码,需要的朋友可以参考下 首先来看下上传部分的表单代码: 文件:  这里有几个要注意的地方,首先看这句 ,这里我们采用POST方法,个别浏览器还支持PUT方法,当 ...

  6. 文件上传漏洞详解(CTF篇)

    需要了解的前置知识: 1.什么是文件上传: 文件上传就是通过流的方式将文件写到服务器上 文件上传必须以POST提交表单 表单中需要 <input type="file" na ...

  7. FastDFS的配置、部署与API使用解读(8)FastDFS多种文件上传接口详解(转)

    1.StorageClient与StorageClient1的区别 相信使用happy_fish的FastDFS的童鞋们,一定都熟悉StorageClient了,或者你熟悉的是StorageClien ...

  8. jquery组件WebUploader文件上传用法详解

    这篇文章主要为大家详细介绍了jquery组件WebUploader文件上传用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 WebUploader是由Baidu WebFE(FEX)团队开发的一 ...

  9. struts2框架单文件、多文件上传实例详解

    版权声明:本文为博主原创文章,如需转载,请标明出处. https://blog.csdn.net/alan_liuyue/article/details/79390681 简介 1.上一篇博客讲解了J ...

最新文章

  1. Android Parcelable
  2. 编程之美-分层遍历二叉树方法整理
  3. 选择 GCD 还是 NSTimer ?
  4. 根据经纬度求最近点的三种解法java实现
  5. linux .bin文件处理,linux下制作.bin文件方法简介
  6. java ArrayList集合
  7. Linux 系统中随机数在 KVM 中的应用
  8. Amoeba及其类似产品
  9. 语音信号处理——线性预测编码LPC
  10. Word中批量更新域的两个小方法;更新角标;更新引用
  11. 金税盘没有及时清卡怎么办
  12. 如何使用html、css制作一个期末作业网站【羽毛球体育运动主题html网页设计】
  13. 大数据技术之Hive+Flume+Zookeeper+Kafka详解
  14. Zookeeper和Kafka环境搭建总结
  15. 设计模式---单例模式Singleton
  16. Linux和windows之间实现文件的粘贴复制
  17. ns手柄pc驱动_PC和Switch通吃利器,北通宙斯精英手柄助你一臂之力!
  18. 5G(NR)频率资源划分
  19. 剑三游戏计算机配置,剑网3重制版配置要求
  20. [TTF字体]获取TTF字体的点阵信息

热门文章

  1. MariaDB/MySQL中的变量
  2. MacOS-Homebrew
  3. context,request,response的作用,存活时间,简单上传下载操作
  4. Direct3DCreate9与Direct3DCreate9Ex
  5. 【论文基本功】【LaTeX】公式及其编号
  6. H5 IOS浏览器长按没有保存图片
  7. PLSQL解压版安装及配置
  8. Javascript - 1 引入方式,变量常量,数据类型,运算符,流程控制,数组,函数,对象,DOM
  9. 如何快速搭建个人博客网站(详解)
  10. 云原生Java架构师——KubeSphere DevOps流水线部署RuoyiCloud