文章目录

  • 一、前言/先导
  • 二、步骤
  • 三、源码
  • 四、测试结果
  • 五、文件的下载

一、前言/先导

maven的依赖:

注意:common-fileupload,它需要依赖于 commons-io组件;

<dependencies><!--servlet的依赖--><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><!--JSP的依赖--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version></dependency><!--JSTL的依赖--><dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl-api</artifactId><version>1.2</version></dependency><!--standard标签库--><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency><!-- 上传文件的依赖 --><dependency><!--common-fileupload的依赖组件--><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency></dependencies>

文件上传是的注意事项:

  1. 为了保证服务器的安全,上传的文件应该放在一个外界无法访问的地方,比如WEB-INF目录下。
  2. 为了防止文件的覆盖问题,我们要给用户上传的文件一个唯一的文件名。
  3. 通常由一下几种方式:时间戳+随机数、UUID、MD5、自己写一些位运算的算法 要显示文件上传的大小。
  4. 可以限制文件上传的类型,通过后缀判断合法性。

需要用到的类:

  • ServletFileUpload负责处理上传的文件数据,将form表单中的每一个输入项封装成一个FileItem对象。
  • 在使用ServletFileUpLoad对象解析请求时需要DiskFileItemFactory对象,所以我们在进行解析之前就要构造好DiskFileItemFactory对象。
  • 通过ServletFileUpload对象的构造方法或setFileItemFactory()
    方法设置ServletFileUpload对象的fileItemFactory属性。

将会使用的方法:

  1. boolean isFormField(); //判断是是否是文件表单

  2. String getFieldName(); //返回表单的name属性

  3. String getString(); //将FileItem中的保存的数据流以一个字符串返回

  4. String getName(); // 用于获取文集爱你上传字段中的文件名

  5. InputStream getInpuStream(); //以流的形式返回上传文件的数据内容

  6. //清除FileItem中的主体内容。
    //如果主体内容中保存的是临时文件,则删除该临时文件
    void delete();

二、步骤

第一步: 判断是普通表单还是文件表单

第二步:保存路径,建议保存造WEB-INF目录下

第三步:缓存、临时文件(对于大文件,我们应该将其设置为临时文件)

第四步:创建DiskFileItemFactory对象,处理文件上传路径或大小的限制

第五步:获取ServletFileUpload

第六步:处理上传的文件

6.1获得上传的文件名、获取UUID

6.2给每个文件创建一个对应的文件夹

6.3存放文件

6.4上传成功,清除临时文件

三、源码

servlet(ServletUpload):

package com.stdpei;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;/*** @author huxuehao*/
public class ServletUpload extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//判断用户上传的文件是普通表单还是带文件的表单,如果是普通文件直接返回if (!ServletFileUpload.isMultipartContent(request)) {return;}//创建文件上传保存的路路径,在WEB-INF路径下是安全的,用户无法直接访问上传文件String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");//System.out.println(uploadPath);File uploadFile = new File(uploadPath);//判断目录是否存在if (!uploadFile.exists()){uploadFile.mkdir();}//临时路径,如果文件好过了预期大小,就把他放到一个临时文件中,过几天自动删除,或者提醒用户转存为永久String tmpPath = this.getServletContext().getRealPath("WEB-INF/tmp");File tempFile = new File(tmpPath);//判断目录是否存在if (!tempFile.exists()){tempFile.mkdir();}try {//使用 Apache的文件上传组件来实现,common-fileupload,它需要依赖于 commons-io组件;//1、创建DiskFileItemFactory对象,处理文件上传路径或大小的限制DiskFileItemFactory factory = getDiskFileItemFactory(tempFile);//2、获取ServletFileUploadServletFileUpload upload = getServletFileUpload(factory);//3、处理上传的文件String msg = uploadParseRequest(upload,request,uploadPath);//转发一下信息request.setAttribute("msg",msg);request.getRequestDispatcher("msg.jsp").forward(request,response);} catch (FileUploadException e) {e.printStackTrace();}}public static DiskFileItemFactory getDiskFileItemFactory(File tempFile){DiskFileItemFactory factory = new DiskFileItemFactory();//通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将他放到临时文件中factory.setSizeThreshold(1024*1024); //缓冲区大小为1Mfactory.setRepository(tempFile);//临时文件保存的目录,需要一个Filereturn factory;}public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory){ServletFileUpload upload = new ServletFileUpload(factory);/*//监听文件上传进度(别导错包了:org.apache.commons.fileupload.ProgressListener)upload.setProgressListener(new ProgressListener(){//pBytesRead:已经读取到的文件大小//pContentLength : 文件大小public void update(long pBytesRead, long pContentLength, int pItems) {//这个地方是可以实现进度条的:已上传/总大小System.out.println("总大小:"+pContentLength+"已上传"+pBytesRead);}});*///处理乱码问题upload.setHeaderEncoding("utf-8");//设置单个文件的最大值10Mupload.setFileSizeMax(1024*1024*10);//设置总共能够上传文件的大小upload.setSizeMax(1024 * 1024 * 10);return upload;}public static String uploadParseRequest(ServletFileUpload upload, HttpServletRequest request, String uploadPath)throws FileUploadException, IOException {String msg = "";//把前端请求解析,封装成一个FileItem对象List<FileItem> fileItems = upload.parseRequest(request);//遍历每一个请求for (FileItem fileItem : fileItems) {//判断用户上传的表单是不是带文件的表单if (fileItem.isFormField()){ //是一个普通的input(type!=file)String name = fileItem.getFieldName();String value = fileItem.getString("UTF-8");System.out.println(name+":"+value);}else { //带文件(type!=file)//****************************处理文件****************************//拿到文件名字String uploadFileName = fileItem.getName();System.out.println("上传的文件名:"+uploadFileName);//如果文件名不合法(name的值为空),那么直接continueif (uploadFileName.trim().equals("") || uploadFileName==null){continue;}//获得上传的文件名String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/")+1);/*//#########可以通过后缀名来实现文件类型审查##############//获得文件的后缀名String fileExName = uploadFileName.substring(uploadFileName.lastIndexOf(".")+1);System.out.println("文件信息 [文件名:"+fileName+"---文件类型"+fileExName+"]");*///可以使用UUID(唯一识别通用码)保证uuidPath唯一String uuidPath = UUID.randomUUID().toString();//****************************处理文件完毕****************************//真实存在的路径String realPath = uploadPath+"/"+uuidPath;//给每个文件创建一个对应的文件夹,这样的话再不改变名的基础上,重名的文件也可以被存储File realPathFile = new File(realPath);if (!realPathFile.exists()){realPathFile.mkdir();}//****************************存放地址完毕*****************************//获得文件上传的流InputStream inputStream = fileItem.getInputStream();//创建一个文件输出流//realPath是真实的文件夹FileOutputStream fos = new FileOutputStream(realPath + "/"+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 = "文件上传成功";fileItem.delete();//上传成功,清除临时文件//*************************文件传输完毕**************************}}return msg;}
}

web.xml:

  <servlet><servlet-name>upload</servlet-name><servlet-class>com.stdpei.ServletUpload</servlet-class></servlet><servlet-mapping><servlet-name>upload</servlet-name><url-pattern>/upload</url-pattern></servlet-mapping>

upload.jsp:

<%@ page contentType="text/html;charset=UTF-8"%>
<%@ page language="java"%><html>
<head><title>文件上传</title>
</head>
<body>
<br>
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">上传用户: <input type="text" name="username"><br/>上传文件:<input type="file" name="file"><br/><input type="submit" value="提交">
</form>
</body>
</html>

msg.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>消息提示</title>
</head>
<body>${msg}
</body>
</html>

四、测试结果

选择文件:

提交时的进度:

提交成功:

已经存在与Tomcat中:

五、文件的下载

【点击查看】

使用 Apache的文件上传组件(common-fileupload)来实现文件的上传相关推荐

  1. 基于Layui上传组件(upload)的动态增加上传组件并使得每个上传组件都可独立上传

    演示基于laravel框架 1.编写html元素(可根据实际需求进行编写) 2.引入layui相关css,js 3.编写upload组件实例化公共调用方法,首次加载页面需要初始化,因此需要调用uplo ...

  2. Asp.NET大文件上传组件开发总结(二)---提取文件内容

    不知地震什么时候结束,为了给老婆小孩守夜,看来还不能睡,那就把第二篇也写了吧,只是不知对大家有没有用哟. 为了提供文件内容,我们需要首先需确定客户请求中发送的有文件内容,然后确定文件内容的位置.这部分 ...

  3. 【转】Asp.NET大文件上传组件开发总结(二)---提取文件内容

    为了提供文件内容,我们需要首先需确定客户请求中发送的有文件内容,然后确定文件内容的位置.这部分对应的代码如下: 1HttpApplication app = sender as HttpApplica ...

  4. webuploader php版,功能强大的文件上传组件-WebUploader

    使用WebUploader还可以批量上传文件.支持缩略图等等众多参数选项可设置,以及多个事件方法可调用,你可以随心所欲的定制你要的上传组件. 接下来我以图片上传实例,给大家讲解如何使用WebUploa ...

  5. 交互组件滚动条,搜索框,上传组件,翻页的微创新

    纵观交互设计发展史,就是创新的交互模式被广为接受后成为标准,旧的交互模式不断被淘汰的历史.所以交互模式发展也是一个"物竞天择,优胜劣汰"的过程.本文是09年在碳酸饮料会上做过的一次 ...

  6. element-ui upload 上传组件附带额外参数进行上传(表单形式,多个参数)

    之前一直使用upload组件单个上传文件,最近遇到需要上传表单字段,表单中有多个参数 下图是接口要求: 官网上传组件中提供了响应的功能实现,但是demo中未演示,不注意看文档参数的话,可能会不知道这个 ...

  7. 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 )

    文章目录 一.DEX 字节码文件准备 二.拷贝 Assets 目录下的 classes2.dex 字节码文件到内置存储区 三.在 AndroidManifest.xml 清单文件中配置组件 四.启动 ...

  8. Java 文件上传组件 Apache Commons FileUpload 应用指南(二)——FileUpload如何工作?

    在最初的 http 协议中,没有上传文件方面的功能.RFC1867("Form-based File Upload in HTML".) 为 http 协议添加了这个功能.客户端的 ...

  9. vue3 封装文件上传组件

    由于工作需要,项目中经常需要文件上传这个功能,根据业务的需求,使用vue3 简单封装通用型组件. 作用:主要是用来上传图片的一个通用型组件,当然可以上传文件.支持校验 尺寸 , 像素, 文件大小,可以 ...

最新文章

  1. 开启Mac充电提示音
  2. 你们都是怎么学 Python 的?
  3. Go --- 设计模式(工厂模式)
  4. 场地测量的方法和程序_建筑施工测量的内容与方法
  5. Win32多线程编程(1) — 基础概念篇
  6. c语言什么叫为代码写注释算法,急!-伪代码不知哪位高手能够告诉我,什么是伪代码?伪代码编 爱问知识人...
  7. javascript原生事件总结
  8. Java Web 项目SSO实战二之(win7 and Windows server 2008)
  9. LUT Utility for FCPX(Luts调色文件加载工具)
  10. 【OpenCV学习笔记】【函数学习】十三(剔除检测到的不符合要求的对象)
  11. PS中rename-item的一些高级应用
  12. DB2数据库基本操作
  13. EXCEL功能之Excel表格边框设置
  14. 局域网内连接其他计算机共享的打印机
  15. MP3中设置播放顺序的软件《闪存式MP3伴侣》
  16. 国微高校 html源码,国微CMS模板结构_模板教程_广州国微软件高校站群系统---领先的高校站群系统方案|全媒体方案|学校网站系统...
  17. Android Styler插件
  18. 教您用Xshell快速连接远程电脑
  19. 未能将文件 *** \bin\Release\**.dll 复制到 \obj\Release\Package\PackageTmp\bin\***.dll VS发布程序报错 解决办法
  20. 长芯微32位MCU LCM32F103C8T6可P2P替换STM32F103C8T6,无需改动软件直接替代

热门文章

  1. 异步电机模型预测控制MATLAB仿真、感应电机预测控制MATLAB
  2. Matlab画常见的信号函数二
  3. 当上项目经理才知道!Android快速转战Kotlin教程,年薪50W
  4. 140斤减脂到90斤需要多久?
  5. 记忆是相见的一种方式
  6. 计算机默认网关是ip地址吗,电脑如何查找默认网关IP地址?
  7. 【金融项目】尚融宝项目(五)
  8. 网站优化-关键词排名优化
  9. 电脑不小心删除的文件怎么恢复?
  10. 用谷歌浏览器播放audioSource的坑