servlet文件上传和下载
JavaWeb文件上传下载实例讲解(酷炫的文件上传技术)

JavaWeb⽂件上传下载实例讲解(酷炫的⽂件上传技术)⼀、课程概述在Web应⽤系统开发中,⽂件上传功能是⾮常常⽤的功能,今天来主要讲讲JavaWeb中的⽂件上传功能的相关技术实现,并且随着互联⽹技术的飞速发展,⽤户对⽹站的体验要求越来越⾼,在⽂件上传功能的技术上也出现许多创新点,例如异步上传⽂件,拖拽式上传,黏贴上传,上传进度监控,⽂件缩略图,⼤⽂件断点续传,⼤⽂件秒传等等。
本课程需要的基础知识:了解基本的Http协议内容基本IO流操作技术Servlet基础知识javascript/jQuery技术基础知识⼆、⽂件上传的基础对于⽂件上传,浏览器在上传的过程中是将⽂件以流的形式提交到服务器端的,并且所有流数据都会随着Http请求携带到服务器端。
所以,⽂件上传时的请求内容格式要能够基本看懂。
⽂件上传页⾯:<form action="/itheimaUpload/UploadServlet" method="post" enctype="multipart/form-data">请选择上传的⽂件:<input type="file" name="attach"/><br/><input type="submit" value="提交"/></form>Http请求内容:三、Java后台使⽤Servlet接收⽂件如果使⽤Servlet获取上传⽂件的输⼊流然后再解析⾥⾯的请求参数是⽐较⿇烦,所以⼀般后台选择采⽤Apache的开源⼯具common-fileupload这个⽂件上传组件。
//Java后台代码:Commons-fileUpload组件上传⽂件public class UploadServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//1.配置缓存DiskFileItemFactory factory = new DiskFileItemFactory(1*1024*1024,new File("c:/tempFiles/"));//2.创建ServleFileUpload对象ServletFileUpload sfu = new ServletFileUpload(factory);//解决⽂件名称中⽂问题sfu.setHeaderEncoding("utf-8");//3.解析try {List<FileItem> list = sfu.parseRequest(request);//解析所有内容if(list!=null){for(FileItem item:list){String fieldName = item.getFieldName();//获取表单参数值String value = item.getString("utf-8");}else{//⽂件if(item.getName()!=null && !item.getName().equals("")) {//保存到服务器硬盘FileUtils.copyInputStreamToFile(item.getInputStream(), new File("c:/targetFiles/"+item.getName()));item.delete();}}}}} catch (FileUploadException e) {e.printStackTrace();}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}四、使⽤WebUploader上传组件⽂件上传页⾯的前端我们可以选择使⽤⼀些⽐较好⽤的上传组件,例如百度的开源组件WebUploader,这个组件基本能满⾜⽂件上传的⼀些⽇常所需功能,如异步上传⽂件,拖拽式上传,黏贴上传,上传进度监控,⽂件缩略图,甚⾄是⼤⽂件断点续传,⼤⽂件秒传。
关于文件上传与下载的实现方法总结

现就JA V A中文件上传与下载的实现方法总结如下:一、上传方法1.http方式:2)架包mons.fileupload.servlet.ServletFileUpload3)架包com.jspsmart.upload.SmartUpload4)架包jspupload5)传统fileinputstream,fileoutputstream方式6)struts框架支持2.FTP方式:1)sun的架包2)架包.ftp.FTPClient 比较好用3)架包.ftp.FTPClient二、下载方法1.http方式1)servlet+传统fileinputstream,fileoutputstream2)架包.ftp.FTPClient2.FTP方式:1)servlet+架包.ftp.FTPClient 比较好用下面就架包.ftp.FTPClient实现文件上传与下载。
代码如下:上传:JSP:<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html><head><title>文件上传</title></head><body><form action="/struts2HibernateSpring/servlet/uploadServletA" method="post">文件位置:<input type="file" name="mfile"><br><input type="submit" value="提交"></form></body></html>SERVLET:package com.test;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class UploadServletA extends HttpServlet {private static final long serialVersionUID = 1L;public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {try{request.setCharacterEncoding("utf-8");response.setCharacterEncoding("UTF-8");response.setContentType("text/html; charset=UTF-8");String myFile = request.getParameter("mfile"); //获取页面提交的文件int indexOf = stIndexOf("\\"); //获取最后一个“/”所在的索引位String fileName = myFile.substring(indexOf); //获取文件上传的文件名//创建输出流把指定的文件写入WEB工程的upload目录下(需要在WebRoot目录下创建upload目录)。
Java文件上传与文件下载实现方法详解

Java⽂件上传与⽂件下载实现⽅法详解本⽂实例讲述了Java⽂件上传与⽂件下载实现⽅法。
分享给⼤家供⼤家参考,具体如下:Java⽂件上传数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传。
⽂件上传是数据上传的⼀种特例,指客户端向服务器上传⽂件。
即将保存在客户端的⽂件上传⼀个副本到服务器,并保存在服务器中。
1、上传表单要求⽂件上传要求客户端提交特殊的请求——multipart请求,即包含多部分数据的请求。
必须将<form/>标签的enctype属性值设为“multipart/form-data”,enctype表⽰encodingType,及编码类型由于客户端上传⽂件的⼤⼩是不确定的,所以http协议规定,⽂件上传的数据要存放于请求正⽂中,不能出现在URL地址栏内。
也就是说,想要上传⽂件必须提交POST请求。
表单中要有<input type="file" />标签注意:multipart/form-data请求与普通请求不同2、下载⽂件上传jar包并查看官⽅⽂档选择Commons中的FileUpload项⽬,并下载jar包和源⽂件查看FileUpload的⼯作⽅式查看FileUpload项⽬的API3、使⽤第三⽅jar包上传⽂件public class RegisterServlet extends HttpServlet {private static final long serialVersionUID = 1L;public RegisterServlet() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.getWriter().append("Served at: ").append(request.getContextPath());}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//第⼀步、判断请求是否为multipart请求if(!ServletFileUpload.isMultipartContent(request)) {throw new RuntimeException("当前请求只⽀持⽂件上传");}try {//第⼆步、创建FileItem⼯⼚DiskFileItemFactory factory = new DiskFileItemFactory();//设置临时⽂件存储⽬录String path = this.getServletContext().getRealPath("/Temp");File temp = new File(path);factory.setRepository(temp);//单位:字节。
day20文件上传和下载

内容概要文件的上传必要的前提:a.表单的method 必须是post,get方式有长度限制b. 表单form的属性的enctype必须是multipart/from-data类型作用form的enctype属性和请求消息头”Content-Type”作用是一样的,告知服务器请求正文的类型启动Tomcat进行试验:文件上传的前提是以上的abc文件上传原理:案例演示创建页面index.jspaction交给处理创建文本文件a.txt结果是null nullServletRequest中有getInputStream和getReader所以以流的方式获取客户端的提交的数据有分页符请求正文的分析器,使用第三方的开源工具3使用第三方组件实现文件上传:用来解析请求正文commons 就是对基本类的封装,将一些代码进行重构后封装,使得使用更方便,使用工具的方式减少代码的书写量搭建环境:拷入jar包解析过程常用类的分析内存和虚拟内存,文件一般使用内存进行存储,但是会使用硬盘的空间进行存储文件名在工具jar包中的FAQ中文件的保存路径上传jsp页面修改路径限制用户的上传文件类型生成GUID的方法文件上传需要的数据库设计c 文件过多,检索耗时较多使用这种方式可以创建16*16个目录4e 限制上传文件的类型使用ie就可以自动识别浏览器的类型,即使被修改成了图片的扩展名,也不会上传文件,但是,火狐浏览器不能识别伪装了图片扩展名的文件,也会上传该文件解决办法:每个文件的头部都有对应的文件类型,获取到该头部的文件类型,然后进行判断。
限制上传文件的大小当文件超出的大小限制的时候需要抓捕异常,对异常进行处理设置总文件大小的限制临时文件的问题进度条问题:带进度条的文件上传文件下载Servlet规范中的监听器FrameDemo案例演示说明观察者设计模式服务器会注册监听器Spring容器当访问request.getSession的时候才会创建Session在访问index.jsp的时候会创建Session,因为jsp默认的Session是TRUE 使用Session监听器可以监听访问量需求分析定义User类定义list集合作为数据库创建登录页面创建登录Servlet创建默认主页User实现HttpSessionListener,实现其方法知识总结。
文件上传下载、数据库数据分页处理

SmartUpload类的主要方法(续) int save(ng.String destPathName, int option):将上传文件保存在目录路径。其中的 参数option的值有三个可选值:SAVEAS_PHYSICAL(以 操作系统的根目录为根另存)、SAVEAS_VIRTUAL(以web 应用程序的根目录为根另存)、SAVEAS_AUTO(由系统决 定) Files getFiles():返回上传文件的集合,返回类型为Files Files类的主要方法(续) int getCount():返回集合中文件的数目 File getFile(int index):得到索引值i对应的文件 long getSize():文件集合中所有文件的大小
若指明了enctype值为multipart/form-data,则进行文 件上传。类似于上一个例子,但数据格式不同,具体如下:
-----------------------------7d9186c902aa Content-Disposition: form-data; name="p1"
表单域名字
FileItem接口的主要方法(续) String getString():以字符串方式将文件或表单内容返回, 编码方式为默认的; String getName():返回在客户端文件系统的原始文件名 long getSize():返回文件的大小; write(java.io.File file):一个上传文件写入磁盘的简便方 法 DiskFileItemFactory类的主要方法 DiskFileItemFactory():构造方法; void setSizeThreshold(int sizeThreshold):设置向硬盘 写数据时缓冲区的大小; void setRepository(java.io.File repository):设置临时 文件的位置。
18.Javaweb中文件的上传和下载【重要】

18.Javaweb中⽂件的上传和下载【重要】Javaweb中⽂件的上传和下载⽂件上传⽂件上传指的是⽤户通过浏览器向服务器上传某个⽂件,服务器接收到该⽂件后会将该⽂件存储在服务器的硬盘中,通常不会存储在数据库中,这样可以减轻数据库的压⼒并且在⽂件的操作上更加灵活,常见的功能是上传头像图⽚。
⽂件上传的原理所谓的⽂件上传就是服务器端通过request对象获取输⼊流,将浏览器端上传的数据读取出来,保存到服务器端。
⽂件上传的要求提供form表单,表单的提交⽅式必须是post【get请求装不下那么多】form表单中的enctype属性必须是 multipart/form-data 【照着做就⾏】表单中提供input type=”file”上传输⼊域 【⽂件那个表单】先来个表单:<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><figure><img src=""></figure><form action="#" method="post" accept-charset="utf-8" enctype="multipart/form-data"> <!--# 提交地址记得改!--><input type="file" name="photo"><br><input type="submit" value="上传头像"></form></body></html>来个Servlet来接收⼀下这个图⽚:package upload;import java.io.IOException;import java.io.InputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** ⽂件上传例⼦*/public class file extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求的输⼊流InputStream is = request.getInputStream();//读取输⼊流中的数据int leng = 0;byte[] bytes = new byte[1024];while ((leng = is.read(bytes)) != -1) {//先打印控制台看看System.out.println(new String(bytes,0,leng));}}}打印出来的数据:------WebKitFormBoundarypM4ZEsxzVdl0NfZVContent-Disposition: form-data; name="photo"; filename="4-2 鍥剧墖鍒囨崲鏁堟灉[20210508-164643].jpg"Content-Type: image/jpeg反正⼀堆乱码但是头部我们是看的懂的就是⼀些标签的属性和上传的照⽚名字!和⽂件类型!如何解决?请看:FileUpload⼯具的使⽤在实际开发中通常会借助第三⽅⼯具来实现上传功能,应⽤较多的是apache旗下的Commons-fileupload。
JavaWeb实现文件上传下载功能实例详解

JavaWeb实现⽂件上传下载功能实例详解在Web应⽤系统开发中,⽂件上传和下载功能是⾮常常⽤的功能,今天来讲⼀下JavaWeb中的⽂件上传和下载功能的实现。
⽂件上传概述1、⽂件上传的作⽤例如⽹络硬盘!就是⽤来上传下载⽂件的。
在智联招聘上填写⼀个完整的简历还需要上传照⽚呢。
2、⽂件上传对页⾯的要求上传⽂件的要求⽐较多,需要记⼀下:必须使⽤表单,⽽不能是超链接表单的method必须是POST,⽽不能是GET表单的enctype必须是multipart/form-data在表单中添加file表单字段,即<input type=”file” name=”xxx”/><form action="${pageContext.request.contextPath }/FileUploadServlet"method="post" enctype="multipart/form-data">⽤户名:<input type="text" name="username"/><br/>⽂件1:<input type="file" name="file1"/><br/>⽂件2:<input type="file" name="file2"/><br/><input type="submit" value="提交"/></form>3、⽐对⽂件上传表单和普通⽂本表单的区别通过httpWatch查看“⽂件上传表单”和“普通⽂本表单”的区别。
⽂件上传表单的enctype=”multipart/form-data”,表⽰多部件表单数据;普通⽂本表单可以不设置enctype属性:当method=”post”时,enctype的默认值为application/x-www-form-urlencoded,表⽰使⽤url编码正⽂当method=”get”时,enctype的默认值为null,没有正⽂,所以就不需要enctype了对普通⽂本表单的测试:<form action="${pageContext.request.contextPath }/FileUploadServlet" method="post">⽤户名:<input type="text" name="username"/><br/>⽂件1:<input type="file" name="file1"/><br/>⽂件2:<input type="file" name="file2"/><br/><input type="submit" value="提交"/></form>通过httpWatch测试,查看表单的请求数据正⽂,我们发现请求中只有⽂件名称,⽽没有⽂件内容。
servlet实现文件上传和文件下载

=
request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path
+"/" ;
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>
boolean isOk=download(request, response);// 具体实现 if(isOk==true){
request.getRequestDispatcher("success.jsp").forward(request, response); }else{
request.getRequestDispatcher("error.jsp").forward(request, response); } }
</servlet-mapping>
<servlet-mapping> <servlet-name>fileLoad</servlet-name> <url-pattern>/fileLoad</url-pattern>
</servlet-mapping>
</web-app>
index.jsp 如下
public boolean download(HttpServletRequest request,HttpServletResponse response) {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
servlet文件上传和下载对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。
这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的。
common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。
一、开发环境搭建创建一个FileUploadAndDownLoad项目,加入Apache的commons-fileupload文件上传组件的相关Jar包,如下图所示:二、实现文件上传2.1、文件上传页面和消息提示页面upload.jsp页面的代码如下:1 <%@ page language="java" pageEncoding="UTF-8"%>2<!DOCTYPE HTML>3<html>4<head>5<title>文件上传</title>6</head>78<body>9<form action="${pageContext.request.contextPath}/servlet/UploadHandleServlet" enctype="multipart/form-data" method="post">10上传用户:<input type="text" name="username"><br/>11上传文件1:<input type="file" name="file1"><br/>12上传文件2:<input type="file" name="file2"><br/>13<input type="submit" value="提交">14</form>15</body>16</html>message.jsp的代码如下:1 <%@ page language="java" pageEncoding="UTF-8"%>2<!DOCTYPE HTML>3<html>4<head>5<title>消息提示</title>6</head>78<body>9${message}10</body>11</html>2.2、处理文件上传的ServletUploadHandleServlet的代码如下:1package me.gacl.web.controller;23import java.io.File;4import java.io.FileOutputStream;5import java.io.IOException;6import java.io.InputStream;7import java.util.List;8import javax.servlet.ServletException;9import javax.servlet.http.HttpServlet;10import javax.servlet.http.HttpServletRequest;11import javax.servlet.http.HttpServletResponse;12import mons.fileupload.FileItem;13import mons.fileupload.disk.DiskFileItemFactory;14import mons.fileupload.servlet.ServletFileUpload;1516public class UploadHandleServlet extends HttpServlet {1718public void doGet(HttpServletRequest request, HttpServletResponse response)19throws ServletException, IOException {20//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全21String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");22File file = new File(savePath);23//判断上传文件的保存目录是否存在24if (!file.exists() && !file.isDirectory()) {25System.out.println(savePath+"目录不存在,需要创建");26//创建目录27file.mkdir();28}29//消息提示30String message = "";31try{32//使用Apache文件上传组件处理文件上传步骤:33//1、创建一个DiskFileItemFactory工厂34DiskFileItemFactory factory = new DiskFileItemFactory();35//2、创建一个文件上传解析器36ServletFileUpload upload = new ServletFileUpload(factory);37//解决上传文件名的中文乱码38upload.setHeaderEncoding("UTF-8");39//3、判断提交上来的数据是否是上传表单的数据40if(!ServletFileUpload.isMultipartContent(request)){41//按照传统方式获取数据42return;43}44//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项45List<FileItem> list = upload.parseRequest(request);46for(FileItem item : list){47//如果fileitem中封装的是普通输入项的数据48if(item.isFormField()){49String name = item.getFieldName();50//解决普通输入项的数据的中文乱码问题51String value = item.getString("UTF-8");52//value = new String(value.getBytes("iso8859-1"),"UTF-8");53System.out.println(name + "=" + value);54}else{//如果fileitem中封装的是上传文件55//得到上传的文件名称,56String filename = item.getName();57System.out.println(filename);58if(filename==null || filename.trim().equals("")){59continue;60}61//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt62//处理获取到的上传文件的文件名的路径部分,只保留文件名部分63filename = filename.substring(stIndexOf("\\")+1);64//获取item中的上传文件的输入流65InputStream in = item.getInputStream();66//创建一个文件输出流67FileOutputStream out = new FileOutputStream(savePath + "\\" + filename); 68//创建一个缓冲区69byte buffer[] = new byte[1024];70//判断输入流中的数据是否已经读完的标识71int len = 0;72//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据73while((len=in.read(buffer))>0){74//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中75out.write(buffer, 0, len);76}77//关闭输入流78in.close();79//关闭输出流80out.close();81//删除处理文件上传时生成的临时文件82item.delete();83message = "文件上传成功!";84}85}86}catch (Exception e) {87message= "文件上传失败!";88 e.printStackTrace();8990}91request.setAttribute("message",message);92request.getRequestDispatcher("/message.jsp").forward(request, response);93}9495public void doPost(HttpServletRequest request, HttpServletResponse response)96throws ServletException, IOException {9798doGet(request, response);99}100 }在Web.xml文件中注册UploadHandleServlet1<servlet>2<servlet-name>UploadHandleServlet</servlet-name>3<servlet-class>me.gacl.web.controller.UploadHandleServlet</servlet-class>4</servlet>56<servlet-mapping>7<servlet-name>UploadHandleServlet</servlet-name>8<url-pattern>/servlet/UploadHandleServlet</url-pattern>9</servlet-mapping>文件上传成功之后,上传的文件保存在了WEB-INF目录下的upload目录,如下图所示:2.3、文件上传的细节上述的代码虽然可以成功将文件上传到服务器上面的指定目录当中,但是文件上传功能有许多需要注意的小细节问题,以下列出的几点需要特别注意的1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。