JSP文件上传

Commons-FileUpload组件:

关键类:

ServletFileUpload类(实现文件上传操作。操作factory把提交上来的数据转化为FileItem)

常用方法:

1.Public List parseRequest(HttpServletRequest): 解析表单中的每一个字符数据,返回一个FileItem集合,把所有Http请求里的数据转化为FileItem对象

2.构造方法:ServletFileUpload(FileItemFactory Factory) :借助FileItemFactory,创建控制上传的核心类实例

3.setSizeMax(long sizeMax):设置请求信息实体内容的最大字节数,控制文件大小

4.public static final boolean isMultipartContent():判断请求中是否有附件,判断是否是mutipart/form-data

5.setHeaderEncoding(String encoding):设置转换时所使用的字符集编码

接口:

1.FileItemFactory接口:(工厂生产FileItem,原料是Http提交的请求) 实现类:DiskItemFactory

                FileItemFactory factory = new DiskFileItemFactory();

2.FileItem:封装单个表单字段元素的数据,一个表单字段元素对应一个FileItem实例

FileItem常见方法:

isFormField():判断FileItem对象封装的数据类型,普通返回true,文件表单返回false

getName():获取的是文件上传字段中的文件名,只有type类型为file的才会被获取,若是普通表单字段获取不到会返回Null

getFieldName():获取普通表单的name属性值

write():将FileItem对象中保存的主体内容保存到指定文件中去

getString():把form表单的值都转为String类型

getSize():获取文件大小(字节数)

 

步骤:

1:准备环境:拷贝JAR包到lib文件夹下,fileupload,i/o

2:设置表单的enctype属性

<form enctype="multypart/form-data" method="post">

method必须为post,因为对于文件而言,没有办法被get请求转化为url附加上去

在表单中使用File控件选择文件<input type="file">

3:开始上传:

   导入包:

              <%@ page import="org.apache.commons.fileupload.*" %>
              <%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
              <%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>

3.1:创建FileItemFactory对象

3.2:创建ServletFileUpload对象(通过上面的对象,实例化ServletFileUpload对象)

          解析form表单提交的所有表单元素数据

                     如果是普通表单元素

                                   获取钙元素的名和值使用

                     如果是文件数据

                                    获取文件名等参数

                                    保存文件数据到服务器

示例代码(包含限制文件大小和格式):

<%@page import="java.io.File"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'upload.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <%  
    	//创建FileItem工厂
    	FileItemFactory factory = new DiskFileItemFactory();
    	ServletFileUpload upload = new ServletFileUpload(factory);
    	//判断是否是文件上传的表单
    	boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    	
    	//设置上传文件最大字节
    	upload.setSizeMax(30*1024*1000);//30KB
    	try{
    		if(isMultipart){
    		//获取FileItem集合
    		List<FileItem> items = upload.parseRequest(request);
    		System.out.print("size>>>>"+items.size());
    		for(FileItem item:items){
    			//确定是否是文件组件
    			boolean isFormField = item.isFormField();
    			if(isFormField){
    			//isFormField为true代表是普通表单
    				String name = item.getFieldName(); //得到表单字段name属性值
    				String value = item.getString("UTF-8"); //保存主体内容
    				System.out.print("name>>>>"+name+"    value>>>>"+value);
    			}else{
    			//先设定路径
    				String savepath = application.getRealPath("upload");
    				String fileName  = item.getName();
    				//通过Arrays类的asList()方法创建固定长度的集合
    				List<String> fileType = Arrays.asList("gif");
    				String ext = fileName.substring(fileName.lastIndexOf(".")+1);//拿到文件名小数点后面的内容
    				if(!fileType.contains("ext")){
    					out.print("上传失败,格式只能是GIF");
    				}else{
    					File file = new File(savepath+"/"+fileName);
    					item.write(file);//保存到指定文件中
    				}
    				
    			}
    		}
    	}else{
    		out.print("非法文件上传");
    	}
    	}catch(FileUploadBase.FileSizeLimitExceededException e){
    		e.printStackTrace();
    		out.print("您上传的文件超出最大字节"+upload.getSizeMax()/1024+"kb");
    	}
     %>
  </body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值