使用common-fileupload完成文件的上传

  • javajavajava 把你写在前头因为今天是情人节
  • 总体框架
  • 导包
  • 前端
    • index.jsp
    • info.jsp
  • 后端
    • 1.1.1. 创建保存文件的路径;
    • 2.2.2. fileupload三部曲
    • 3.3.3. 三个封装方法
      • getDiskFileItemFactory
      • getServletFileUpload
      • uploadParseRequest
    • 4.4.4. 转发页面
    • 整体后端代码
  • 我上传的照片

javajavajava 把你写在前头因为今天是情人节

万千世界,偏偏选择了你;
有你,哥不再寂寞。

总体框架

导包

 <!--上传文件依赖--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.1</version></dependency>

前端

index.jsp

1.1.1. <%@page contentType=“text/html;charset=UTF-8” language=“java” %>需要加在头部,防止乱码;
2.2.2. ${pageContext.request.contextPath}/upload.do这是路径的常用写法;
3.3.3. method="post"的请求方式不限制大小,因此用post;
4.4.4. "enctype="multipart/form-data这个表示有文件上传的表单。

<%@page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2><form action="${pageContext.request.contextPath}/upload.do" method="post"enctype="multipart/form-data"><p>用户名:<input type="text" name="username" placeholder="请填写用户名" ></p><p>上传文件:<input type="file" name="filename"></p><p><input type="submit" value="提交"><input type="reset" value="重置"></p>
</form>
</body>
</html>

info.jsp

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

后端

1.1.1. 创建保存文件的路径;

// 判断上传的文件普通表单还是带文件的表单if (!ServletFileUpload.isMultipartContent(request)) {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 file = new File(tmpPath);//判断目录是否存在,不存在则创建if (!file.exists()) {file.mkdir();}

2.2.2. fileupload三部曲

说明:三部曲对应了三个封装的方法;而前两个方法可以不写,使用默认的;

         // 1、创建DiskFileItemFactory对象,处理文件路径或者大小限制// 若超过规定大小则放在临时文件DiskFileItemFactory factory = getDiskFileItemFactory(file);// 2、创建ServletFileUpload对象  监听上传进度, 处理乱码等ServletFileUpload upload = getServletFileUpload(factory);// 3、处理上传文件// 把前端请求解析,封装成FileItem对象,需要从ServletFileUpload对象中获取String msg = uploadParseRequest(upload, request, uploadPath);

3.3.3. 三个封装方法

getDiskFileItemFactory

 public static DiskFileItemFactory getDiskFileItemFactory(File file) {DiskFileItemFactory factory = new DiskFileItemFactory();// 通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将他放到临时文件中;factory.setSizeThreshold(1024 * 1024);// 缓冲区大小为1Mfactory.setRepository(file);// 临时目录的保存目录,需要一个filereturn factory;}

getServletFileUpload

public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {ServletFileUpload upload = new ServletFileUpload(factory);// 监听上传进度upload.setProgressListener(new ProgressListener() {// pBYtesRead:已读取到的文件大小enctype="multipart/form-data"// pContextLength:文件大小public void update(long pBytesRead, long pContentLength, int pItems) {System.out.println("总大小:" + pContentLength + "已上传:" + pBytesRead+",进度:"+((double)pBytesRead/pContentLength)*100+"%");}});// 处理乱码问题upload.setHeaderEncoding("UTF-8");// 设置单个文件的最大值upload.setFileSizeMax(1024 * 1024 * 10);// 设置总共能够上传文件的大小// 1024 = 1kb * 1024 = 1M * 10 = 10мreturn upload;}

uploadParseRequest

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()) {// 判断上传的文件是普通的表单还是带文件的表单// getFieldName指的是前端表单控件的name;String name = fileItem.getFieldName();String value = fileItem.getString("UTF-8"); // 处理乱码System.out.println(name + ": " + value);} else {// 判断有无上传的文件// ============处理文件==============// 拿到文件路径 /images/haizei/xiangkesi.pngString uploadFileName = fileItem.getName();System.out.println("上传的文件名: " + uploadFileName);if (uploadFileName.trim().equals("") || uploadFileName == null) {continue;}// 获得上传的文件名 xiangkesiString fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);// 获得文件的后缀名 pngString fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);/** 如果文件后缀名fileExtName不是我们所需要的 就直按return.不处理,告诉用户文件类型不对。*/System.out.println("文件信息[件名: " + fileName + " ---文件类型" + fileExtName + "]");// UUID. randomUUID(),随机生一个唯一识别的通用码;String uuidPath = UUID.randomUUID().toString();// ================处理文件完毕==============// 存到哪? uploadPath// 文件真实存在的路径realPathString realPath = uploadPath + "/" + uuidPath;// 给文件创建一个名为通用码的文件夹File realPathFile = new File(realPath);if (!realPathFile.exists()) {realPathFile.mkdir();}// ==============存放地址完毕==============// 获得文件上传的流InputStream inputStream = fileItem.getInputStream();// 创建一个文件输出流FileOutputStream fos = new FileOutputStream(realPath + "/" + fileName);// 创建一个缓冲区byte[] buffer = new byte[1024 * 1024];// 判断是否读取完毕int len = 0;// 如果大于0说明还存在数据;while ((len = inputStream.read(buffer)) > 0) {fos.write(buffer, 0, len);}// 关闭流fos.close();inputStream.close();msg = "文件上传成功!";fileItem.delete(); // 上传成功,清除临时文件//=============文件传输完成=============}}return msg;}

4.4.4. 转发页面

// Servlet请求转发消息System.out.println(msg);if(msg == "文件上传成功!") {// Servlet请求转发消息request.setAttribute("msg",msg);request.getRequestDispatcher("info.jsp").forward(request, response);}else {msg ="请上传文件";request.setAttribute("msg",msg);request.getRequestDispatcher("info.jsp").forward(request, response);}} catch (FileUploadException e) {e.printStackTrace();}

整体后端代码

package com.tl.fileupload;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.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;/*** @author tl*/
public class FileServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try{// 判断上传的文件普通表单还是带文件的表单if (!ServletFileUpload.isMultipartContent(request)) {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 file = new File(tmpPath);//判断目录是否存在,不存在则创建if (!file.exists()) {file.mkdir();}/*处理上传的文件,一般都需要通过流来获取,我们可以使用 request.getInputstream(),原生态的文件上传流获取,十分麻烦但是我们都建议使用 Apache的文件上传组件来实现,common-fileupload,它需要commons-io组件;*/// 1、创建DiskFileItemFactory对象,处理文件路径或者大小限制//     若超过规定大小则放在临时文件DiskFileItemFactory factory = getDiskFileItemFactory(file);// 2、获取ServletFileUpload  监听上传进度, 处理乱码等ServletFileUpload upload = getServletFileUpload(factory);// 3、处理上传文件// 把前端请求解析,封装成FileItem对象,需要从ServletFileUpload对象中获取String msg = uploadParseRequest(upload, request, uploadPath);// Servlet请求转发消息System.out.println(msg);if(msg == "文件上传成功!") {// Servlet请求转发消息request.setAttribute("msg",msg);request.getRequestDispatcher("info.jsp").forward(request, response);}else {msg ="请上传文件";request.setAttribute("msg",msg);request.getRequestDispatcher("info.jsp").forward(request, response);}} catch (FileUploadException e) {e.printStackTrace();}}public static DiskFileItemFactory getDiskFileItemFactory(File file) {DiskFileItemFactory factory = new DiskFileItemFactory();// 通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将他放到临时文件中;factory.setSizeThreshold(1024 * 1024);// 缓冲区大小为1Mfactory.setRepository(file);// 临时目录的保存目录,需要一个filereturn factory;}public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {ServletFileUpload upload = new ServletFileUpload(factory);// 监听上传进度upload.setProgressListener(new ProgressListener() {// pBYtesRead:已读取到的文件大小enctype="multipart/form-data"// pContextLength:文件大小public void update(long pBytesRead, long pContentLength, int pItems) {System.out.println("总大小:" + pContentLength + "已上传:" + pBytesRead+",进度:"+((double)pBytesRead/pContentLength)*100+"%");}});// 处理乱码问题upload.setHeaderEncoding("UTF-8");// 设置单个文件的最大值upload.setFileSizeMax(1024 * 1024 * 10);// 设置总共能够上传文件的大小// 1024 = 1kb * 1024 = 1M * 10 = 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()) {// 判断上传的文件是普通的表单还是带文件的表单// getFieldName指的是前端表单控件的name;String name = fileItem.getFieldName();String value = fileItem.getString("UTF-8"); // 处理乱码System.out.println(name + ": " + value);} else {// 判断有无上传的文件// ============处理文件==============// 拿到文件路径 /images/haizei/xiangkesi.pngString uploadFileName = fileItem.getName();System.out.println("上传的文件名: " + uploadFileName);if (uploadFileName.trim().equals("") || uploadFileName == null) {continue;}// 获得上传的文件名 xiangkesiString fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);// 获得文件的后缀名 pngString fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);/** 如果文件后缀名fileExtName不是我们所需要的 就直按return.不处理,告诉用户文件类型不对。*/System.out.println("文件信息[件名: " + fileName + " ---文件类型" + fileExtName + "]");// UUID. randomUUID(),随机生一个唯一识别的通用码;String uuidPath = UUID.randomUUID().toString();// ================处理文件完毕==============// 存到哪? uploadPath// 文件真实存在的路径realPathString realPath = uploadPath + "/" + uuidPath;// 给文件创建一个名为通用码的文件夹File realPathFile = new File(realPath);if (!realPathFile.exists()) {realPathFile.mkdir();}// ==============存放地址完毕==============// 获得文件上传的流InputStream inputStream = fileItem.getInputStream();// 创建一个文件输出流FileOutputStream fos = new FileOutputStream(realPath + "/" + fileName);// 创建一个缓冲区byte[] buffer = new byte[1024 * 1024];// 判断是否读取完毕int len = 0;// 如果大于0说明还存在数据;while ((len = inputStream.read(buffer)) > 0) {fos.write(buffer, 0, len);}// 关闭流fos.close();inputStream.close();msg = "文件上传成功!";fileItem.delete(); // 上传成功,清除临时文件//=============文件传输完成=============}}return msg;}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}
}

我上传的照片

使用common-fileupload完成文件的上传相关推荐

  1. java fileupload 文件_java用Commons fileupload 文件的上传

    java用Commons fileupload 文件的上传 基于表单的文件上传 如果在表单中使用表单元素 />,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文 ...

  2. fileupload实现多文件批量上传

    原文地址为: fileupload实现多文件批量上传 前提条件: 需要如下架包:下面是maven的配置信息 <!--文件上传依赖架包--> <dependency> <g ...

  3. 【2022/08/11】文件的上传(FileUpload)

    文件的上传(FileUpload) 在Web应用中,文件上传和下载功能是非常常用的功能,对于文件上传,浏览器在上传的过程中是将文件以一个二进制的数据流的形式提交到服务器端的,不能够使用request. ...

  4. WebUploader文件图片上传插件的使用

    最近在项目中用到了百度的文件图片上传插件WebUploader.分享给大家 需要在http://fex.baidu.com/webuploader/download.html点击打开链接下载WebUp ...

  5. # nest笔记四:文件的上传与下载

    nest笔记四:文件的上传与下载 nest是基于express之上的,所以,其文件上传和下载的功能,实际上就是express的功能. 下载 文件下载有两种,一个是sendFile,一个是downloa ...

  6. SpringMVC+SwfUpload进行多文件同时上传

    由于最近项目需要做一个多文件同时上传的功能,所以好好的看了一下各种上传工具,感觉uploadify和SwfUpload的功能都比较强大,并且使用起来也很方便.SWFUpload是一个flash和js相 ...

  7. SpringMVC实现文件的上传和下载

    SpringMVC实现文件的上传和下载http://www.bieryun.com/1120.html 前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:"用什么技术来实现一般网页上文件的 ...

  8. Akka实战:HTTP大文件断点上传、下载,秒传

    2019独角兽企业重金招聘Python工程师标准>>> 访问:https://github.com/yangbajing/scala-applications/tree/master ...

  9. struts2 实现多文件限制上传

    struts2的文件上传特别简单,把我做的小例子给大家看一下 upload.jsp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...

  10. j2ee html5,HTML5+J2EE实现文件异步上传

    P.S. HTML5经过了W3C的8年努力,终于正式推广了.这次升级最大的就是升级了XMLHTTPRequest,让它变成了XMLHTTPRequest Level II(这有啥奇怪的?).这个对象现 ...

最新文章

  1. HTML5会成为移动互联网应用开发的未来吗?
  2. 一步步的教新手如何在一台物理机上部署红帽和win7双系统 ...
  3. qt 中出现ld returned1exit status错误的几个原因
  4. 如何选择一个Linux发行版本
  5. 十分钟轻松搞懂CSS的五大定位方式!(建议收藏)
  6. Python代码调试之异常回溯
  7. python多因子量化选股模型_量化新兵第十步:多因子选股模型
  8. GitHub 标星 10,000+,Apache 顶级项目 ShardingSphere 的开源之路
  9. 上海卓道医疗完成千万级Pre-A轮融资,幂方资本领投...
  10. JS的一些时间获取和计算公用方法封装
  11. C/C++ 图像二进制存储与读取
  12. Flutter diff: /../Podfile.lock: No such file or directory AndroidStudio上的解决
  13. 进程中出现n多的conime.exe怎么办
  14. 基于51单片机和555定时器的电阻电感电容测量装置设计
  15. 漫画 | 中间件到底是什么东西?
  16. 【LeetCode102. 二叉树的层序遍历】——层序遍历
  17. 如何判断PHP数组是否为空
  18. BitXHub跨链交易的流程
  19. 【激光测距仪方案】激光测距仪的测量原理及作用方法
  20. python除法编程_Java和Python中的整数除法,取余,舍入

热门文章

  1. 程序员发帖引争议!公务员香吗?哪来的优越感?
  2. HTML效果图谷歌打不开,关于谷歌浏览器打不开Axure原型的HTML问题解决
  3. 常用的XSS攻击手段和目的有哪些 网络安全入门教程
  4. 一篇文章带你深入理解什么是负载测试
  5. 小程序聊天对话,每次都显示最新消息(让页面自动滚动到底部)
  6. (产品贴)移动护理平台
  7. 三维建模 Cinema 4D
  8. 2021年起重机司机(限桥式起重机)模拟考试及起重机司机(限桥式起重机)实操考试视频
  9. OpenWrt入坑之路
  10. 树莓派 摄像头安装配置