JavaWeb文件的上传与下载(1)
经常用到的上传:
头像上传,资料分享等
文件上传的步骤
1、指定表单类型为文件上传表单
enctype="multipart/form-data"
2、表单提交方式必须为:post(get方式只能提交1k大小的数据)
3、表单中存在文件域表单元素
如下:
<form action="${pageContext.request.contextPath/test }" method="post" enctype="multipart/form-data" > 文件:<input type="file" name="file1" /><br> 用户名:<input type="text" name="username" /><br> <input type="submit" value="提交" /> </form>
一、手动实现文件上传
代码如下
package com.gqx.uploadself; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 手动处理文件上传 * @author Administrator * */ public class test extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); /* * 下面的方法是通常我们用的request.getParameter()方法的原型 * 下面的方法经过解析后就是request.getParameter()方法了 */ //request.getQueryString(); //获取GET:username=gqxing&pwd=111 //request.getInputStream();//获取POST:inputStream /* * 现在获取的是文件数据,是post请求,只能用request.getInputStream() */ //获取表单(POST)数据 InputStream in=request.getInputStream(); //转为为字符流 InputStreamReader inReader=new InputStreamReader(in); //为了读取方便,加入一个缓冲流BufferedReader(读取字符流) BufferedReader reader=new BufferedReader(inReader); String str=null; while((str=reader.readLine())!=null){ System.out.println(str); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
之后启动服务器,提交表单和上传文件(这里是文本文件)后就会看到控制台的的输出一下内容
如果需要获取上传数据,需要对上面的结果进行解析(就是对字符串的处理),每一次上传都是这样的结构,每一次都要解析,将每一个上传项通过FileItem去封装相应的数据,但这样自己写一个解析程序,有点麻烦,同时不利于代码的后期维护,别人对你代码不太熟悉,这个时候可以使用apach提供的一个组件。
二、使用FileUpload组件(apach提供)
api说明
—DiskFileItemFactory 文件上传的工厂类(把每一个请求表单封装为一个个的FileItem对象)
setRepository(repository);设置删除临时目录(当上传文件过大的时候,会把文件写入临时文件,再从临时文件输出到指定文件中,再把临时文件清除)
—ServletFileUpload 文件上传核心类,可以获取所有的FileItem对象
isMultipartContent(request):判断文件是否是表单类型
parseRequest(request):获取所有文件上传项
setFileSizeMax(fileSizeMax); 设置上传总文件的最大值
setSizeMax(sizeMax);设置单个文件上传的最大值
setHeaderEncoding("utf-8");设置上传文件的编码格式
—FileItem 封装了普通表单项的值以及上传表单项的值
item.getFieldName(); 获取上传表单元素名称
item.getString(); 获取上传数据
item.getString("utf-8") 获取上传数据,处理中文
item.getContentType(); 获取上传文件类型【一般用于文件项】
item.getInputStream(); 获取文件流【一般用于文件项】
item.getName(); 获取文件名【一般用于文件项】
item.write(file); 写文件【一般用于文件项】
item.delete() 删除临时文件【一般用于文件项】
组件使用:
下载组件;引入jar文件(commons-fileupload-1.2.1.jar 和 commons-io-1.4.jar )
实例代码如下
package com.gqx.uploadjar; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * 文件上传组件的使用 * @author Administrator * */ public class FileUpLoad extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); //1、创建文件上传工厂类 FileItemFactory fac=new DiskFileItemFactory(); //2、创建文件上传的核心类对象 ServletFileUpload upload=new ServletFileUpload(fac); //判断当前表单是否是文件上传表单 if (upload.isMultipartContent(request)) { //3、把请求数据转化为FileItem对象集合 List<FileItem> list; try { list = upload.parseRequest(request); //遍历每一个上传项 for (FileItem fileItem : list) { //判断:是普通表单项,还是文件上传表单 if (fileItem.isFormField()) { //普通表单 String fileName=fileItem.getFieldName(); //表单元素名称 String content=fileItem.getString(); //文本框值 System.out.println(fileName+content); }else { //文件上传表单 String fileName=fileItem.getFieldName(); //表单元素名称 String contentType=fileItem.getContentType(); //文件类型 String name=fileItem.getName(); //文件名 InputStream in=fileItem.getInputStream(); //文件流 System.out.println(fileName+contentType+name+in); } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
运行结果如下:
案例:
实现一个完整的文件上传
1、设置单个文件不超过30兆
2、设置总大小不超过50兆
3、上传目录:上传到项目资源目录下的upload目录下
代码如下:
package com.gqx.uploadjar; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * 文件上传的完整案例 * @author Administrator * */ public class FileUpLoadCase extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); // 1、创建上传工厂类 DiskFileItemFactory factory=new DiskFileItemFactory(); //2、创建文件上传核心类 ServletFileUpload upload=new ServletFileUpload(factory); //[1]设置当个文件最大:30M upload.setFileSizeMax(30*1024*1024); //[2]设置总文件大小不超过50M upload.setSizeMax(50*1024*1024); //判断是否是文件上传表单 if (upload.isMultipartContent(request)) { //3、把请求数据转化为FileItem的集合 try { List<FileItem> items=upload.parseRequest(request); //遍历FileItem for (FileItem fileItem : items) { //判断普通表单还是文本表单 if (fileItem.isFormField()) { //获取元素名称 String fieldName=fileItem.getFieldName(); //获取值 String value=fileItem.getString("utf-8"); System.out.println(fieldName+":"+value); }else { //文件上传 //获取文件名 String name=fileItem.getName(); //获取文件目录 String basePath=getServletContext().getRealPath("/upload"); //创建文件对象 File file=new File(basePath,name); fileItem.write(file); fileItem.delete();//删除临时文件 } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }