52-第三方控件修饰文本输入框

本文详细介绍了Apache Commons-FileUpload组件在处理HTTP文件上传中的作用,包括其优势、使用方法和核心接口。通过设置sizeThreshold和repositoryPath控制内存缓冲区和临时文件路径,使用ServletFileUpload进行请求解析,以及FileItem接口提供的各种方法来获取文件信息。此外,还提到了文件上传前后端交互和富文本编辑器的应用。

一、Commons-FileUpload组件:
1.Commons是Apache开放的源代码组织的一个java子项目其中的FileUpload是用来处理HTTP文件上传的子项目
2.使用简单:Commons-FileUpload组件可以方便的嵌入到JSP文件中,在JSP文件中仅编写少量的代码就可以完成文件的上传功效,非常的方便】
3.能够全程控制上传内容:可以获取全部上传文件的信息包括名称,类型,大小等,方便操作
4.能够对上传文件的大小,类型进行控制:为了避免在上传过程中出现异常的数据,在Commons-FileUpload组件中,专门提供了相对应的方法用于对上传文件进行控制
5.上传文件的时候,form标签的method属性必须设置成post,不能设置为get
6.必须具备的炸包:commons-fileupload-1.2.2.jar和commons-io-2.4jar文件
在表单中的中设置enctype=“multipart/form-data”;

7.FileItemFactory接口
实现类:DiskFileItemFactory
常用的方法public void setSizeThreshold;设置内存换冲区的大小
public void setRepositoryPath(String path);设置临时文件存放目录

8.FileItem接口的常用的方法
方法名称
public boolean isFormFiled();判断FileItem对象封装的数据类型(普通的表单字段返回true,文件表单字段返回false)

public String getName();获取文件上传字段中 的文件名(普通的表单字段返回null)

public String getFieldName();返回表单字段元素的name属性值

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

public String getString();将FileItem对象中保存的主体内容以一个字符串返回。其中的重载方法public String getString(String encoding)中的参数用指定的字符集编码方式

public long getSize();返回单个上传文件的字节数;

9.ServletFileUpload常用的方法

public void setSizeMax(long sizeMax);设置请求信息实体内容的最大允许字节数

public List parseRequest(HttpServiiceRequest req);解析form表单中每个字符的数据,返回一个FileItem对象的集和

public static final boolean isMultipartContent(HttpServletRequest req);判断请求中的内容是否是multipart/form-data类型

public void setHeadederEncoding(String encoding);设置转换时所使用的字符编码

二、文件上传中的前段和后端

	<form action= "表单提交的地址" enctype="multipart/form/data"   method="post">
		用户名:<input type="text " name ="username"/>
		头像:<input type = "file"  name="upload"/>
		<input type="submit"  value="提交">
	<form/>

三、编写处理页面的实现步骤
1.创建FileItemFatory对象
2.创建ServletFileUpload对象那个
3.解析form表单提交的所有表单元素数据
进行判断:
如果是普通的表单元素:那么就获取该元素的名和值
如果是文件数据:获取文件名的等参数
还要进行保存文件数据到服务器
四、富文本编辑器
CKEditor编辑器
CLEditor编辑器

index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>首页</title>
<link href="css/bootstrap.css" rel="stylesheet"/>
<link href="cleditor/jquery.cleditor(1).css" rel="stylesheet"/>
</head>
<body>
	<!--
		1.method必须是post(get和post区别记住回忆)
		2.传输数据形式:能够支持文件流
			enctype="application/x-www-form-urlencoded"普通文本传输name=value
			enctype="multipart/form-data"多部件表单数据
		3.要准备文件域 也要写上name属性,这样文件才能上传到网页上去
		<input type="file" name="xxx"/>
	  -->
	  <form action="doUpload.jsp" method="post" class="form-horizontal" enctype="multipart/form-data">
		<div class="form-group">
    		<label for="categoryId" class="col-sm-1 control-label">新闻分类:</label>
	    	<div class="col-sm-2">
	    		<select name="categoryId" class="form-control">
					<option value="1">国内</option>
					<option value="2">国际</option>
					<option value="3">娱乐</option>
					<option value="4">军事</option>
				</select>
	   	 	</div>
  		</div>
  		<div class="form-group">
    		<label for="title" class="col-sm-1 control-label">标题:</label>
	    	<div class="col-sm-2">
				<input type="text" name="title" id="title" class="form-control"/>
	   	 	</div>
  		</div>
  		<div class="form-group">
    		<label for="summary" class="col-sm-1 control-label">摘要:</label>
	    	<div class="col-sm-8">
				<textarea name="summary" id="summary" class=""></textarea>
	   	 	</div>
  		</div>
		<div class="form-group">
    		<label for="content" class="col-sm-1 control-label">内容:</label>
	    	<div class="col-sm-8">
				<textarea name="content" id="content" class="form-control ckeditor"></textarea>
	   	 	</div>
  		</div>
  		<div class="form-group">
    		<label for="author" class="col-sm-1 control-label">作者:</label>
	    	<div class="col-sm-2">
				<input type="text" name="author" id="author" class="form-control"/>
	   	 	</div>
  		</div>
  		<div class="form-group">
    		<label for="newsPic" class="col-sm-1 control-label">图片:</label>
	    	<div class="col-sm-2">
				<input type="file" name="newsPic" id="newsPic"/>
	   	 	</div>
  		</div>
  		<div class="form-group">
  			<label class="col-sm-1 control-label"></label>
	    	<div class="col-sm-2">
				<input type="submit" class="btn btn-primary" value="发表新闻"/>
	   	 	</div>
  		</div>
	</form>
	<script type="text/javascript" src="ckeditor/ckeditor.js"></script>
	<script type="text/javascript" src="js/jquery.min.js"></script>
	<script type="text/javascript" src="cleditor/jquery.cleditor(1).js"></script>
	<script type="text/javascript">
		$(function(){
			$("#summary").cleditor();
		});
	</script>
</body>
</html>
doUpload.jsp
<%@page import="cn.kgc.service.NewsServiceImpl"%>
<%@page import="cn.kgc.service.NewsService"%>
<%@page import="java.util.Date"%>
<%@page import="org.apache.commons.beanutils.BeanUtils"%>
<%@page import="cn.kgc.entity.News"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@page import="org.apache.commons.io.FilenameUtils"%>
<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="java.util.List"%>
<%@page import="java.util.Arrays"%>
<%@page import="org.apache.commons.fileupload.FileUploadBase"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@page import="org.apache.commons.fileupload.FileItemFactory"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	NewsService newsService = new NewsServiceImpl();

	// 处理文件上传   需要使用第三方的控件 commons-fileupload 
	// 1.创建FileItemFactory
	FileItemFactory fif = new DiskFileItemFactory();

	// 2.创建FileUpload
	ServletFileUpload upload = new ServletFileUpload(fif);
	try{
		Map<String,Object> paramsMap = new HashMap<String,Object>();
		
		// 解决问题1:单位:字节  如果超过大小  会抛出异常
		upload.setFileSizeMax(6*1024*1024); 
		// 判断文件上传表单是否设置过enctype="multipart/form-data" 如果不是 则文件无法传递
		if(ServletFileUpload.isMultipartContent(request)){
			
			// 将请求内的信息转换成FileItem对象集合
			List<FileItem> fileItems = upload.parseRequest(request);
			for(FileItem fileItem : fileItems){
				// 做不同的处理
				if(fileItem.isFormField()){ // 如果是普通的表单内容:我们只需要获取对应内容值即可
					// 获取name属性值
					String name = fileItem.getFieldName();
					// 获取值
					String value = fileItem.getString("UTF-8");
					paramsMap.put(name, value);
					// System.out.println(name+"  "+value);
				}else{ // 如果是文件表单:除了要获取相关信息之外  还要进行文件存储
					// 文件大小
					long fileSize = fileItem.getSize(); 
					// 文件名
					String fileName = fileItem.getName();
					String extension = FilenameUtils.getExtension(fileName);
					// 解决问题2:只允许一部分格式的文件上传 例如:只允许jpg,jpeg,png上传
					List<String> extensionList = Arrays.asList("jpg","jpeg","png");
					if(extensionList.contains(extension)){
						// 解决问题3:为了防止出现重名覆盖问题 所以一般情况下 我们会自定义新的命名格式
						String newFileName = System.currentTimeMillis()+"_newPic."+extension;
						// 存储文件
						File file = new File("D:/images/"+newFileName);
						fileItem.write(file);
						// 文件路径记得别存储绝对路径 除非你是有专门的文件存储服务器
						paramsMap.put("picPath","images/"+newFileName);
						out.print("文件上传成功!");
					}else{
						out.print("上传文件格式不支持!");
					}
				}
			}
			
			// 开始将数据存储到News对象中
			News news = new News();
			// 将Map集合信息存储到一个Bean对象
			//将集合中的键添加到news对象中
			BeanUtils.populate(news, paramsMap);
			news.setCreateDate(new Date());
			System.out.println(news);
			//讲新闻添加到news表中
			newsService.addNews(news);
			out.print("添加成功!");
		}else{
			out.print("非法文件上传!");
		}
	}catch(FileUploadBase.FileSizeLimitExceededException e){
		e.printStackTrace();
		out.print("文件大小超过限制!");
	}catch(Exception e){
		e.printStackTrace();
		out.print("添加失败!服务器繁忙!");
	}
	
%>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值