文件上传-通过commons_FIleUpload实现

一、Commons-FileUpload

简介:

Apache提供的实现文件上传的组件;免费的、开源的。

组件特点:

  1. 使用简单:可以方便的嵌入到JSP页面中,缩写少量代码就可以完成文件上传功能。
  2. 能够全程控制上传内容。
  3. 能够对上传文件大小、类型进行控制。

FileItem接口:

  1. 封装表单元素的数据。(不同类型的表单元素分别对应一个FileItem对象)
  2. 具有对表单内容处理的方法。
    **FileItemFactory接口:**用于构建FileItem实例。
    **DiskFileItemFactory类:**是FileItemFactory接口实现类。
    FileItemFactory factory= new DiskFileItemFactory();
    ServletFileUpload类:
    1.组件的核心类。
    2.封装表单元素并以集合方式返回。
    3.语法: public ServletFileUpload(FileItemFactory fileitemfactory)

这里写图片描述
二、.准备jar包
commons-fileupload.jar
commons-io.jar
三、 form表单

//文件:add_news.jsp
//表单里enctype="multipart/form-data"代表的是(文本、文件)多重提交
//必须 method=”post” ,如果get,地址栏里文件参数会非常非常长
<form action="../util/do_add_news.jsp" method="post" enctype="multipart/form-data" onsubmit="return check()">  
// input的type=”file”意味着文件上传框
<input name="file" type="file" class="opt_input" />

4.多重提交的处理

//文件:do_add_news.jsp
提交的时候,要判断哪个参数是文件,哪个参数是文本
   如果是文本,直接向数据库保存就可以了
   如果是文件,要获得文件本身,上传到服务器中

<%
NewsService ns=new NewsService();
News news=new News();
request.setCharacterEncoding("utf-8");

//判断提交的表单是否包含上传文件的清单
boolean isMultiPart=ServletFileUpload.isMultipartContent(request);
String uname="";
int age=0;
if(isMultiPart){
	//如果是多重提交,获取全部表单元素的list
	FileItemFactory ff= new DiskFileItemFactory();
	ServletFileUpload sfu=new ServletFileUpload(ff);
	List<FileItem> itemList=sfu.parseRequest(request);
	Iterator<FileItem> it=itemList.iterator();
	//遍历表单元素
	while(it.hasNext()){
		FileItem item=it.next();
		//如果是文本的话,封装到对象内
		if(item.isFormField()){
			if(item.getFieldName().equals("ntid")){
				int ntid=Integer.parseInt(item.getString("utf-8"));
				news.setNtid(ntid);
			}
			if(item.getFieldName().equals("ntitle")){
				news.setNtitle(item.getString("utf-8"));
			}
			if(item.getFieldName().equals("nauthor")){
				news.setNauthor(item.getString("utf-8"));
			}
			
			if(item.getFieldName().equals("nsummary")){
				news.setNsummary(item.getString("utf-8"));
			}
					
			if(item.getFieldName().equals("ncontent")){
				news.setNcontent(item.getString("utf-8"));
			}

			
			if(item.getFieldName().equals("npicpath")){
				news.setNpicpath(item.getString("utf-8"));
			}					
		}else{
			//如果是非文本(即文件),则获取文件名字并保存文件到服务器
			String fileName=item.getName();
	
			String savePath=request.getSession().getServletContext().getRealPath("/upload");

			news.setNpicpath(fileName);
			File fileSave= ictures\Sample Pictures\Chrysanthemum.jpgnew File(savePath,fileName);
			System.out.println(fileName);
			System.out.println(savePath);
			item.write(fileSave);
			

		}
	}
}

news.setNcreatedate("2016-12-01 10:36");
news.setNmodifydate("2016-12-01 10:36");
int result=ns.addNews(news);
//response.sendRedirect("../newspages/admin.jsp");
%>  

5.隐患
用IE浏览器提交文件,fileName会带上路径,路径含有“/”因此注定不能保存在服务器。可以提前对fileName进行判断,如果含有“/”,将最后一个“/”之前的部分截去,保留文件名部分。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值