文件上传-通过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)

文件上传-通过commons_FIleUpload实现_第1张图片
二、.准备jar包
commons-fileupload.jar
commons-io.jar
三、 form表单

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

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 itemList=sfu.parseRequest(request);
	Iterator 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进行判断,如果含有“/”,将最后一个“/”之前的部分截去,保留文件名部分。

文件上传-通过commons_FIleUpload实现_第2张图片

你可能感兴趣的:(JSP)