本篇文章小编给大家分享一下JavaWeb实现上传文件功能代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
这是需要使用到的两个jar包一定要导入到lib目录中,并添加到发布的lib目录下
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>$Title$ 点击上传文件
upload.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>上传文件页面
UpLoadServlet
package com.pzy.servlet; 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.http.HttpServletRequest; import java.io.*; import java.util.List; import java.util.UUID; public class UpLoadServlet extends javax.servlet.http.HttpServlet { protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { doGet(request,response); } protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { try { //先判断提交的是普通请求还是带有文件的请求 if(!ServletFileUpload.isMultipartContent(request)){ return;//如果是普通文件,直接返回 }//如果通过了这个if,那说明表单是带有文件的 //创建上传文件的保存路径,建议在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的文件上传组件来实现,commons-fileupload,它需要依赖于common-io */ //1.创建DiskFileItemFactory对象,处理文件上传路径和大小限制的; DiskFileItemFactory factory=getDiskFileItemFactory(file); //2.获取ServletFileUpLoad ServletFileUpload upload=getServletFileUpLoad(factory); //3.处理上传的文件 String msg=uploadParseRequest(upload,request,uploadPath); //servlet请求转发消息 request.setAttribute("msg",msg); request.getRequestDispatcher("msg.jsp").forward(request,response); } catch (FileUploadException e) { e.printStackTrace(); } } public static DiskFileItemFactory getDiskFileItemFactory(File file) { DiskFileItemFactory factory = new DiskFileItemFactory(); //通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将他放入临时文件中 factory.setSizeThreshold(1024*1024);//此时设置缓冲区大小为1M factory.setRepository(file);//临时目录的保存目录,需要一个file return factory; } public static 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);//最大值为10m //设置总共文件能够上传的文件大小 upload.setSizeMax(1024*1024*10); return upload; } public static String uploadParseRequest(ServletFileUpload upload, HttpServletRequest request, String uploadPath) throws FileUploadException, IOException { String msg=""; //把前端请求进行解析,封装成一个FileItem对象 ListfileItems = 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{//判断它是上传的文件 //============================================处理文件================================= //拿到文件的名字 String uploadFileName = fileItem.getName(); System.out.println("上传的文件名是:"+uploadFileName); if(uploadFileName.trim().equals("")||uploadFileName==null){ continue; } //获得上传的文件名 (一般进来的文件都会包含目录.例如/image/girl/pop.png) String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1); //获得后缀 String fileExtName=uploadFileName.substring(uploadFileName.lastIndexOf(".")+1); /* 如果文件后缀名fileExtName不是我们需要的就直接return,不处理,告诉用户文件类型不对 */ System.out.println("文件信息名:"+fileName+"----文件类型"+fileExtName); //可以使用UUID(唯一识别的通用码),保证文件名的唯一; //UUID.randomUUID(),随机生成一个唯一识别的通用码; String uuidPath = UUID.randomUUID().toString(); //==========================文件处理完毕===================================== //存到哪? uploadPath //文件的真实存在路径 realPath String realPath=uploadPath+"/"+uuidPath; //给每个文件创建一个对应的文件夹 File realPathFile = new File(realPath); if(!realPathFile.exists()){ realPathFile.mkdir(); } //=================================存放地址完毕======================================== //获得文件上传的流 InputStream inputStream = fileItem.getInputStream(); //创建一个文件输出流 //realPath=真实的文件夹 //这只是到最后一级的目录,还差一个文件;加上输出文件的名字+"/"uuidFileName; 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; } }
msg.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>消息提示 ${msg}
WEB-XML
UpLoadServlet com.pzy.servlet.UpLoadServlet UpLoadServlet /upload.do
上传成功后,可以看到upload文件夹下存在一个有uuid码组成的文件夹,文件夹下是我们上传的文件
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整