目录

1.简述

2.原理讲解

3.代码如下(含注释)

3.1获得DiskFileItemFactory对象

3.2获得ServletFileUpload对象

3.3上传文件

3.4 doPost()

4.运行结果


1.简述

在一个web项目中,用户向工程中上传文件是十分常见的操作,如头像设置、背景图片设置等。服务器在保存用户上传的文件的时候,需要解决以下四个问题:1.用户上传的文件不能直接通过在地址栏输入url去访问;2.用户上传的文件不能被覆盖(在同一个文件夹下的同名文件会被覆盖);3.限制上传文件的最大值;4.可以限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。

这篇文章将简单讲解如何在Javaweb项目上传文件并解决上面提到的四个问题

2.原理讲解

上传文件的表单如图所示

一般在处理上传文件的时候,用流来处理,但是这样的话需要自己实现网络通信底层,太麻烦了,这里使用apache的commons-io组件来完成。

ServletFileUpload类负责处理上传的文件数据,并将表单中的每个输入项封装成FileItem对象。在获取ServletFileUpload对象的时候,需要一个DiskFileItemFactory对象

通过ServletFileUpload对象获得FileItem对象后,遍历所有的FileItem对象,判断每个对象只是简单的表单元素还是包含了文件,若包含了文件,将文件进行处理保存,并转发到上传信息的页面就好了。

为了避免用户通过输入url地址直接访问到服务器上的文件,可以设置拦截器,这里就直接把文件存储在WEB-INF目录下了。为了防止文件覆盖,项目中使用了UUID这个类来获得一个唯一的标识符,利用这个唯一的标识符来存储文件就不会发生覆盖的情况了。

3.代码如下(含注释)

3.1获得DiskFileItemFactory对象

    public DiskFileItemFactory getDiskFileItemFactory(File tempFile){DiskFileItemFactory factory = new DiskFileItemFactory();
//        为上传文件设置一个大小限定,当文件超过这个大小的时候,缓存在暂存区factory.setSizeThreshold(1024*1024); //大小为1Mfactory.setRepository(tempFile); //设置暂存区return factory;}

3.2获得ServletFileUpload对象

    public ServletFileUpload getServletFileUpload(DiskFileItemFactory factory){ServletFileUpload upload = new ServletFileUpload(factory);upload.setProgressListener(new ProgressListener() {@Override
//            pBytesRead:已经读取的文件大小
//            pContentLength:文件总大小public void update(long pBytesRead, long pContentLength, int pItems) {System.out.println("总大小:"+ pContentLength + ";已上传:" + pBytesRead);}});
//        处理乱码问题upload.setHeaderEncoding("UTF-8");
//        设置单个文件的最大值upload.setFileSizeMax(1024*1024*10);
//        设置总共能够上传文件的大小upload.setSizeMax(1024*1024*10);return upload;}

3.3上传文件

public void uploadFile(HttpServletRequest req, HttpServletResponse resp,ServletFileUpload upload, String uploadPath) throws IOException, ServletException {String msg = "文件上传失败";//        把前端请求解析,封装成一个FileItem对象,从ServletFIleUpload对象中获取List<FileItem> fileItems = null;try {fileItems = upload.parseRequest(req);} catch (FileUploadException e) {e.printStackTrace();}for (FileItem fileItem : fileItems) {
//            当前FileItem对象只是一个表单对象if(fileItem.isFormField()){String name = fileItem.getFieldName(); //获得表单控件的name值String value = fileItem.getString("UTF-8");//获得文本,处理乱码System.out.println(name+" :"+value);}else {
//            当前FileItem包含文件
//                    ===========================处理文件===============================String uploadFileName = fileItem.getName();if(uploadFileName.trim().equals("") || uploadFileName==null){continue;}//                获得上传的文件名String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/")+1);
//                获得上传的文件后缀String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".")+1);//                使用UUID获得一个唯一的识别通用码,保证文件名唯一
//                网络传输中的东西,都需要序列化
//                实体类如果想要在多个电脑上运行,需要进行传输===》使用序列号String uuidPath = UUID.randomUUID().toString();//                ==========================存放地址==========================================String readPath = uploadPath+"/"+uuidPath;
//                给每个文件创建也给对应的文件夹File realPathFile = new File(readPath);if(!realPathFile.exists()){realPathFile.mkdir();}//               ===========================文件传输==========================================
//                获得文件上传的流InputStream inputStream = fileItem.getInputStream();
//                创建一个文件输出流FileOutputStream fos = new FileOutputStream(readPath+"/"+fileName);
//                创建一个缓冲区byte[] buffer = new byte[1024*1024];
//                判断是否读取完毕int len = 0;while ((len=inputStream.read(buffer))>0){fos.write(buffer, 0, len);}
//                关闭流fos.close();inputStream.close();}msg = "文件上传成功";}req.setAttribute("msg", msg);req.getRequestDispatcher("info.jsp").forward(req, resp);}

3.4 doPost()

   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        判断上传的文件是普通表单还是带文件的表单String msg = "文件上传失败";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();}//        缓存临时文件
//        临时路径,如果文件超过了预期大小,就放到临时文件夹下String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp");File tmpFile = new File(tmpPath);if(!tmpFile.exists()){tmpFile.mkdir();}//        处理上传的文件,一般需要通过流来获取
//        此处使用apache的组件来实现  commons-io/** ServletFileUpload负责处理上传的文件数据,并将表单中的每个输入项封装成fileItem对象* 在使用ServletFileUpload对象解析请求时需要DIskFileItemFactory对象* 所有,需要在进行解析工作前构造好DiskFileItemFactory对象*///       1. 创建DiskFileIntemFactory对象,处理文件上传路径或者大小限制DiskFileItemFactory factory = getDiskFileItemFactory(tmpFile);//      2。获取ServletFileUploadServletFileUpload upload = getServletFileUpload(factory);//        3.处理上传文件uploadFile(req, resp,upload, uploadPath);}

补充:通过表单上传文件,get方法对上传文件的大小有限制,post方法没有限制,所以一般使用post方法。而且使用get方法的话在获取ServletFileUpload时会出错。另外,表单如果包含一个文件上传输入的话,这个表单的enctype属性就必须设置为multipart/form-data。

4.运行结果

通过表单提交了文件后,可以在tomcat目录下找到项目文件夹,在WEB-INF目录下就多出了upload和temp这两个文件夹,上传的文件都保存在这两个文件夹下面。

javaweb上传文件相关推荐

  1. web 上传文件到linux没权限,Javaweb上传文件到Linux 没有读写权限

    一. 问题描述 背景描述: 0.saas-business-运营后台,website-网站页面. 1.javaweb程序(saas-business)部署在linux系统 tomcat服务器下,使用该 ...

  2. javaweb上传文件_javaWeb中,如何通过CommonsFileUpload组件上传文件

    大家好,欢迎来到雄雄的小课堂,今天给大家分享的是<javaWeb中,如何通过Commons-FileUpload组件上传文件> 前言:文件上传大家都不陌生,在这个互联网飞速发展的时代,共享 ...

  3. 阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例

    参考文档 : 点击查看 文章目录 运行环境 一.OSS相关概念 1.1 Storage Class 存储类型 1.2 Bucket 存储空间 1.3 Object 对象 1.4 Region 地域 1 ...

  4. javaweb中运用fileupload上传文件

    本文是介绍javaweb开发运用Apache中的commons fileupload的commons io的工具来进行文件上传,在开发中会遇到很多比较棘手的问题,本人接触后进行了总结. 开发准备: 去 ...

  5. ajax上传 java,javaWeb中使用ajax上传文件

    javaWeb上传图片 上传文件所必要的两个jar包:commons-fileupload.jar.commons-io.jar. 核心代码: String withPath = req.getSer ...

  6. JavaWeb 使用ajax上传文件并显示进度条等上传信息

    文件上传在Web程序中是常用的功能,一般上传图片或者文件大小比较少的文件客户端不需要显示上传进度或文件上传的信息,如果是上传的文件比较大的时候,可以在客户端展示文件上传进度以及根据业务的需求显示文件上 ...

  7. javaweb开发之处理表单上传文件和文件下载

    2019独角兽企业重金招聘Python工程师标准>>> 一.基于表单的上传文件 1. enctype属性 当表单需要上传文件时,需指定表单 enctype 的值为 multipart ...

  8. SpringMVC上传文件

    首先自我介绍一下,我是王登高,下面是我的头像: 是不是很帅,我每天照镜子都感觉自己帅. 好了不扯这些没用的,我们进入正题:前两天,自己边学边做遇到的SpringMVC上传文件的问题,用户可以上传图片, ...

  9. JSP上传文件失败的问题 未解决

    服务器操作系统:CentOS 7.3 64位 本机:win10上使用WinSCP远程传输文件,使用putty远程执行命令 已经完成的步骤: Tomcat启动 下图,成功启动 后台 Servlet 编写 ...

最新文章

  1. Servlet--01--概念
  2. oracle材料差异科目,ORACLE分科目统计每科前三名的学生的语句
  3. Zeroc Ice 发布订阅者之demo Icestorm之clock
  4. 实用的HTML5的上传图片方法
  5. java基础面试题:说说和的区别
  6. 1月31日 资源网站(素材模板)
  7. 软件_mongo占用磁盘空间过大
  8. presto array_join函数
  9. [转自华尔街的强帖]怎样才能嫁给有钱人
  10. Auto CAD指定线段长度和角度的方法
  11. Postman写接口文档
  12. postgreSQL 中raise notice用法
  13. 【计算机网络】物理层
  14. 帕累托最优和纳什均衡例子
  15. 老梁说天下——慈善的红与黑
  16. 华为如何关闭系统更新提示
  17. 一个新人眼中的O2O
  18. 基于javaweb+jsp的医院住院管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Bootstrap)
  19. 毕业季——在校生讲述
  20. 爬虫框架:Scrapy 快速入门

热门文章

  1. Cocos开发者焦点小组(第一期)招募开始啦!!
  2. Sql超时时间已到,在操作完成之前超时时间已过或服务器未响应。
  3. 网口的左右两个LED灯代表什么意思
  4. java对象内存布局中的基本类型字段排列顺序
  5. 树莓派python工业数据采集系统
  6. java局部刷新表格数据,局部刷新如何实现?看我简单实现局部刷新、分页
  7. github视频床视频批量导入
  8. 17张思维导图,一网打尽机器学习统计基础(附下载)
  9. 海典ERP与汉码盘点机对接门店实时盘点计划及程序使用方法,实时盘点,云盘点方案
  10. 怎么找到一个程序员做男朋友