注意事项

我们在文件上传的时候需要知道一下几个事项。
1.为了服务器的安全,上传的文件应该放在外界不能直接访问的文件夹下,比如我们可以放在WEB-INF目录下。
2.为了防止上传文件出现覆盖 现象,上传文件的文件名应该保持他的唯一性(时间戳、uuid、位运算……)。
3.要限制上传文件的最大值。
4.限制上传文件的类型,在确定完上传文件名之后,我们应该对文件的后缀名进行判断。

准备工作

我们在进行文件上传之前我们应该准备两个jar包,UUID是啥。
处理上传文件,我们一般是通过request.getInputStream()方法来进行 这样我会很麻烦。我们是用Apache,组件
commonsfileuploadhttps://mirrors.tuna.tsinghua.edu.cn/apache//commons/fileupload/binaries/commons-fileupload-1.4-bin.zip
他的核心以赖于commons-io组件https://mirror.bit.edu.cn/apache//commons/io/binaries/commons-io-2.8.0-bin.zip
UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准。UUID是一个128比特的数值,这个数值可以通过一定的算法计算出来。为了提高效率,常用的UUID可缩短至16位。UUID用来识别属性类型,在所有空间和时间上被视为唯一的标识。

创建项目

这里创建项目的方式有多种,不论你使用那一种创建方式,创建完之后都先要进行这两个jar的导入。

要把所导入的jar同时导入我们的项目目录下。

接下来就是写jsp页面,这里需要注意的是我们创建的from表单提交方式必须是post,enctype="multipart/form-data"类型必须这样写,这样服务器端才能从过流进行获取。<input type="file" name="file1" >这里的name也是必须要写的,否则不能读取。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>$Title$</title></head><body><%--  get提交方式限制文件大小,文件大小只能为4kb左右--%>
<%--  post提交方式不限值文件大小--%>
<%--enctype="multipart/form-data" 表单类型这样是如果服务器端想获取数据就必须要通过流--%>
<%--这里必须加上这个 ${pageContext.request.contextPath}这是获取服务器路径的--%><form action="${pageContext.request.contextPath}/upload.do" enctype="multipart/form-data" method="post"  >上传用户:<input type="text" name="username"><br><input type="file" name="file1" ><br><input type="file" name="file2"><br><input type="submit"></form></body>
</html>

Servlet

接下就是需要我们创建一个servlet,写好映射路径。
我们对表单进行一个判断,看其是否带有上传文件,如果不对就直接结束这个方法不往下走。

//第一步我们是先判断改表单是普通表单还是带有上床文件的表单if (!FileUpload.isMultipartContent(request)){return;//如果是普通的表单他就会true 否则false 此时这个程序就会终止 不在会往下执行}

创建上传文件的路径
这里上传文件的路径在WEB-INF目录下,这样比较安全,外界并不能直接访问WEB-INF文件。有一个判断是判断当前路径下是否存在文件夹,如果不存就创建一个。

//创建上传文件的保存的路径String upLoadPath = this.getServletContext().getRealPath("/WEB-INF/upload");File uploadFile = new File(upLoadPath);if (!uploadFile.exists()){uploadFile.mkdir();//如果不存在就创建一个}

同时我们还需要创建一个临时文件夹,来进行缓冲临时文件。

//临时文件创建,如果文件大小超过我们的预期值,我们会把他存放在临时文件中,过几天会自动删除String tem = this.getServletContext().getRealPath("/WEB-INF/tem");File file1 = new File(tem);if (!file1.exists()){file1.mkdir();//创建一个临时目录}

核心 代码

ServletFileUpload类负责处理上传文件的数据,并将表单中的每个输入项封装成Filetem对象中,使用其paseRequest(HttpServletRequest)方法可以将通过表单中每一个HTML标签提交的数据封装称一个Filetem对象,然后以List列表形式返回,使用改方法处理上文件简单易用。
ServletFileUpload类负责处理上传文件的数据,并将表单中的每个输入项封装成Filetem对象中,再使用ServletFileUpload对象解析请求时需DiskFileItemFactory对象,所以我们在需要进行解析工作前构造好DiskFileItemFactory对象,通过ServletFileUpload对象的构造方法后或setFileItemFactory()方法设置ServletUpLoad对象的fileItem。
对这些类了解完之后,核心步骤就三步,这里我们用了三个方法来写
1.创建DiskFileItemFactory,处理临时文件的上传路径或者大小的限制。

public static DiskFileItemFactory getDiskFileItemFactory(File file) {DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();diskFileItemFactory.setSizeThreshold(1024*1024);//文件缓冲区,超过这个缓冲区1M 会被存为临时文件diskFileItemFactory.setRepository(file);System.out.println("DiskFileItemFactor创建成功");return diskFileItemFactory;}

2获取ServletFileUpload ,监听文件的进度,设置文件的大小,这些是根据情况来的,不写也可以他会有默认值。

public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {ServletFileUpload servletFileUpload = new ServletFileUpload(factory);//监听文件上传进度servletFileUpload.setProgressListener(new ProgressListener() {@Override//l以读文件大小 l1文件大小public void update(long l, long l1, int i) {System.out.println("文件大小为:"+l+"\t"+l1);}});//处理乱码问题servletFileUpload.setHeaderEncoding("utf-8");//设置单个文件的上传最大值servletFileUpload.setFileSizeMax(1024*1024*20);//设置总共能上传文件的大小servletFileUpload.setSizeMax(1024*1024*50);return servletFileUpload;}

3.处理这些上传文件。主要是通过parseRequest()来获取FileItem,
这里需要进行传三个参数,ServletFileUpload,HttpServletRequest ,upLoadPath。在这里根据自己的需要来进行编写。

 public static String  uploadParseRequest(ServletFileUpload servletFileUpload, HttpServletRequest request, String upLoadPath) {String msg="文件上传";try {//把前端请求解析,封装成一个FileTem对象,从servletFileUpload中获取List<FileItem> fileItems = servletFileUpload.parseRequest(request);for (FileItem fileItem:fileItems) {//判断上传表单是普通表单还是带有文件的表单if (fileItem.isFormField()){//获取表单控件名字String fieldName = fileItem.getFieldName();//处理中文乱码String value = fileItem.getString("UTF-8");System.out.println(fieldName+value);}else{//现在是带有文件的表单//处理文件---------------------//获取文件名String name = fileItem.getName();System.out.println(name);//trim()去除前后空格 判断文件名是否合法if (name.trim().equals("")||name==null){continue;//如果不合发他就会直接返回 判断下以位}//获取上传文件名 从最后以个/的下为开始截取String filename = name.substring(name.lastIndexOf("/") + 1);System.out.println(filename);//获取文件的后缀名 用户判断文件名是否合法String fileExtName = name.substring(name.lastIndexOf(".") + 1);System.out.println(fileExtName);//   UUID.randomUUID()会生成一个唯一表示的通用码String uuidPath= UUID.randomUUID().toString();//文件地址---------------//文件存放的真实路径String realpath = upLoadPath + "/" + uuidPath;File realPathFile = new File(realpath);if (!realPathFile.exists()){realPathFile.mkdir();}//文件传输------------ (这个传输过程是先读取本地输入流,再把本地文件上传到服务器上,输出流)//获取文件上传输入的流InputStream inputStream = fileItem.getInputStream();//创建一个输出流FileOutputStream fileOutputStream = new FileOutputStream(realpath + "/"+filename);//创建一个缓冲区byte[] bytes = new byte[1024 * 1024];//判断是否读取完毕int len=0;while ((len=inputStream.read(bytes))>0){fileOutputStream.write(bytes,0,len);}msg="文件上传成功";inputStream.close();fileOutputStream.close();//上传成功清除临时文件fileItem.delete();}}} catch (Exception e) {e.printStackTrace();}return msg;}

接下来就是写一些相应跳转

 request.setAttribute("msg",msg);request.getRequestDispatcher("info.jsp").forward(request,response);

上传完成之后我们需要在这个路径下来进行查找

这里我们可以看到他的文件名是uuid。

完整的servlet

package aw;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
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.annotation.WebServlet;
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;@WebServlet(name = "FileuploadServlet",urlPatterns = {"/upload.do"})
public class FileuploadServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//第一步我们是先判断改表单是普通表单还是带有上床文件的表单if (!FileUpload.isMultipartContent(request)){return;//如果是普通的表单他就会true 否则false 此时这个程序就会终止 不在会往下执行}//创建上传文件的保存的路径String upLoadPath = this.getServletContext().getRealPath("/WEB-INF/upload");File uploadFile = new File(upLoadPath);if (!uploadFile.exists()){uploadFile.mkdir();//如果不存在就创建一个}//临时文件创建,如果文件大小超过我们的预期值,我们会把他存放在临时文件中,过几天会自动删除String tem = this.getServletContext().getRealPath("/WEB-INF/tem");File file1 = new File(tem);if (!file1.exists()){file1.mkdir();//创建一个临时目录}//处理上传文件,我们一般是通过request.getInputStream()方法来进行 这样我会很麻烦//我们是用Apache,组件commons-fileupload,他的核心以赖于commons-io组件//1.创建DiskFileItemFactory对象,处理文件的上传路径或者大小的限制DiskFileItemFactory factory = getDiskFileItemFactory(file1);//2.获取ServletFileUploadServletFileUpload servletFileUpload = getServletFileUpload(factory);System.out.println(servletFileUpload.getSizeMax()+"--------------");//3.处理上传文件String msg = uploadParseRequest(servletFileUpload, request, upLoadPath);request.setAttribute("msg",msg);request.getRequestDispatcher("info.jsp").forward(request,response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}public static DiskFileItemFactory getDiskFileItemFactory(File file) {DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();diskFileItemFactory.setSizeThreshold(1024*1024);//文件缓冲区,超过这个缓冲区1M 会被存为临时文件diskFileItemFactory.setRepository(file);System.out.println("DiskFileItemFactor创建成功");return diskFileItemFactory;}public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {ServletFileUpload servletFileUpload = new ServletFileUpload(factory);//监听文件上传进度servletFileUpload.setProgressListener(new ProgressListener() {@Override//l以读文件大小 l1文件大小public void update(long l, long l1, int i) {System.out.println("文件大小为:"+l+"\t"+l1);}});//处理乱码问题servletFileUpload.setHeaderEncoding("utf-8");//设置单个文件的上传最大值servletFileUpload.setFileSizeMax(1024*1024*20);//设置总共能上传文件的大小servletFileUpload.setSizeMax(1024*1024*50);return servletFileUpload;}public static String  uploadParseRequest(ServletFileUpload servletFileUpload, HttpServletRequest request, String upLoadPath) {String msg="文件上传";try {//把前端请求解析,封装成一个FileTem对象,从servletFileUpload中获取List<FileItem> fileItems = servletFileUpload.parseRequest(request);for (FileItem fileItem:fileItems) {//判断上传表单是普通表单还是带有文件的表单if (fileItem.isFormField()){//获取表单控件名字String fieldName = fileItem.getFieldName();//处理中文乱码String value = fileItem.getString("UTF-8");System.out.println(fieldName+value);}else{//现在是带有文件的表单//处理文件---------------------//获取文件名String name = fileItem.getName();System.out.println(name);//trim()去除前后空格 判断文件名是否合法if (name.trim().equals("")||name==null){continue;//如果不合发他就会直接返回 判断下以位}//获取上传文件名 从最后以个/的下为开始截取String filename = name.substring(name.lastIndexOf("/") + 1);System.out.println(filename);//获取文件的后缀名 用户判断文件名是否合法String fileExtName = name.substring(name.lastIndexOf(".") + 1);System.out.println(fileExtName);//   UUID.randomUUID()会生成一个唯一表示的通用码String uuidPath= UUID.randomUUID().toString();//文件地址---------------//文件存放的真实路径String realpath = upLoadPath + "/" + uuidPath;File realPathFile = new File(realpath);if (!realPathFile.exists()){realPathFile.mkdir();}//文件传输------------//获取文件上传输入的流InputStream inputStream = fileItem.getInputStream();//创建一个输出流FileOutputStream fileOutputStream = new FileOutputStream(realpath + "/"+filename);//创建一个缓冲区byte[] bytes = new byte[1024 * 1024];//判断是否读取完毕int len=0;while ((len=inputStream.read(bytes))>0){fileOutputStream.write(bytes,0,len);}msg="文件上传成功";inputStream.close();fileOutputStream.close();//上传成功清除临时文件fileItem.delete();}}} catch (Exception e) {e.printStackTrace();}return msg;}}

javaweb 文件上传相关推荐

  1. 77.【JavaWeb文件上传和邮件发送04】

    JavaWeb (二十五).文件上传 1.准备工作 2.实用类介绍 3.思维导图: 4.正戏开始 5.完整代码 (二十六).邮箱发送 1.邮箱发送的原理: 2.服务器的原理 3.下载两个jar包 4. ...

  2. JavaWeb 文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  3. JavaWeb文件上传

    准备工作 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的 需要用到的jar包有commons-fileupload文件上传组件,封装文件上传工具类.(commons-io非必要) ...

  4. javaweb文件上传下载

    文件上传概述 1 文件上传的作用 例如网络硬盘!就是用来上传下载文件的. 在智联招聘上填写一个完整的简历还需要上传照片呢. 2 文件上传对页面的要求 上传文件的要求比较多,需要记一下: 必须使用表单, ...

  5. JavaWeb文件上传的实现及ServletFileUpload类的使用

    1.文件上传代码所依赖的jar包: <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload - ...

  6. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  7. JavaWeb学习总结(五十)——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  8. tomcat temp 大量 upload 文件_问题:JavaWeb中实现文件上传的方式有哪些?

    问题:JavaWeb中实现文件上传的方式有哪些? 上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些. 文件上传的方式 Servlet2.5 方式 Servlet ...

  9. JavaWeb:实现文件上传与下载

    JavaWeb:实现文件上传与下载 文件上传前端处理 本模块使用到的前端Ajax库为Axio,其地址为GitHub官网. 关于文件上传 上传文件就是把客户端的文件发送给服务器端. 在常见情况(不包含文 ...

最新文章

  1. PokeCats开发者日志(一)
  2. 网络流量队列优先级相关知识点
  3. halcon/c++接口基础 之内存管理
  4. Vue项目部署遇到的问题及解决方案
  5. HCL安装和使用模拟器中遇到的问题
  6. 英语口语 MP3 下载网址
  7. 大学一年级计算机科学与技术教材,计算机科学与技术系授课计划及课程表一年级.PDF...
  8. 12.51单片机实现电子音乐盒
  9. 面试中遇到的“黑嘴”现象
  10. 如何实现网页的自动登录
  11. 6000+长文,只为讲清IPv6基础知识点
  12. C++检测键盘某键是否按下
  13. matlab计算连续复利,求连续复利计算公式。。。
  14. dvi dp hdmi_HDMI vs DisplayPort vs DVI:您要在新计算机上使用哪个端口?
  15. VAS开启LaFi空投——助力打造区块链数字黄金新生态
  16. python图片裁剪软件_python 实现图片裁剪小工具
  17. 防火防盗防辅导作业,“因材施教”的智慧课堂来了
  18. mac如何更改iTerm的默认窗口大小
  19. 计算机毕业设计 SSM+Vue民宿房屋后勤管理系统 房屋后勤员工管理系统 员工后勤管理系统Java Vue MySQL数据库 远程调试 代码讲解
  20. 生产者消费者问题、读者写者问题、哲学家问题细致讲解

热门文章

  1. 嵌入式Linux的低功耗策略
  2. 当前已提供的各国NTP服务器列表
  3. CVPR-Drafting and Revision: Laplacian Pyramid Network for Fast High-Quality Artistic Style Transfer
  4. 【论文笔记】Learning What Not to Segment: A New Perspective on Few-Shot Segmentation
  5. 周杰伦的2000w个故事
  6. 运动控制卡应用开发教程之C++
  7. pyqt5 日历设计 QSS
  8. 计算机考研英语一和英语二的区别,考研英语一和英语二的区别介绍
  9. 芬兰ZYFRA公司在首届中俄创新大赛中获胜
  10. 中科大辅修计算机,中科大新生入学第二考来了——校规考试!(一不小心就挂)...