一、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("添加失败!服务器繁忙!");
}
%>