Servlet多文件上传

 具体步骤:
 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包
 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同
 3)对 DiskFileItemFactory 对象设置一些 属性
 4)高水平的API文件上传处理  ServletFileUpload upload = new ServletFileUpload(factory);
 目的是调用 parseRequest(request)方法  获得 FileItem 集合list ,
 5)在 FileItem 对象中 获取信息,   遍历, 判断 表单提交过来的信息 是否是 普通文本信息  另做处理
 6) 第一种. 用第三方 提供的  item.write( new File(path,filename) );  直接写到磁盘上
  第二种. 手动处理  
此servlet接收来自表单的新闻题目、新闻内容以及最多7张新闻配图,将题目、内容以及配图的文件名存储数据库中,配图存在上传jsp页面的文件夹下。
servlet接收表单后循环浏览表单,用isFormField()判断是普通表单还是文件,文件则先存在磁盘下,将文件名存入数据库;若是普通表单则按顺序存为新闻标题和新闻内容;最终还将生成当前时间存入数据库。

下为具体代码:

package com.news.controller;
import model.ConnDB;

import java.io.*;
import java.sql.*;
import java.util.Calendar;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class upload extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		int y,m,d,h,mi,s;  
		Calendar cal=Calendar.getInstance();   
		y=cal.get(Calendar.YEAR);    
		m=cal.get(Calendar.MONTH)+1;    
		d=cal.get(Calendar.DATE);    
		h=cal.get(Calendar.HOUR_OF_DAY);    
		mi=cal.get(Calendar.MINUTE);    
		s=cal.get(Calendar.SECOND);  
		String time=y+"-"+m+"-"+d+"  "+h+":"+mi+":"+s;
		System.out.println(time);
		ConnDB cdb=new ConnDB();//连接sql server数据库
		Statement st=cdb.getConn();
		HttpSession session = request.getSession(true); 
		String newstype=(String) session.getAttribute("flag");
		int num=0;//返回新闻总条数
		try {
			ResultSet rs=st.executeQuery("select * from "+newstype+"");
			while(rs.next()) num++;  
			num++;
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		String value[]=new String[3];//保存文字字符串
		String sessiondeliver[]={"title","content"};
		String save[]={"title","content"};
		String realpath[]={"null","null","null","null","null","null","null"};
		int i=0,j=0;
		request.setCharacterEncoding("utf-8");	//设置编码		
		//获得磁盘文件条目工厂
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//获取文件需要上传到的路径
		String path = request.getRealPath("");	
		//如果没以下两行设置的话,上传大的 文件 会占用 很多内存,
		//设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同
		/**
		 * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 
		 * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的 
		 * 然后再将其真正写到 对应目录的硬盘上
		 */
		factory.setRepository(new File(path));
		//设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
		factory.setSizeThreshold(1024*1024) ;		
		//高水平的API文件上传处理
		ServletFileUpload upload = new ServletFileUpload(factory);	
		try {
			//可以上传多个文件
			List<FileItem> list = (List<FileItem>)upload.parseRequest(request);
			for(FileItem item : list)
			{
				//获取表单的属性名字
				String name = item.getFieldName();		
				//如果获取的 表单信息是普通的 文本 信息
				if(item.isFormField())
				{					
					//获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的
					value[j]= item.getString() ;	
					value[j]=new String(value[j].getBytes("ISO-8859-1"),"utf-8");
					session.setAttribute(sessiondeliver[j], value[j]);
					j++;			
				}
				//对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些
				else
				{
					/**
					 * 以下三步,主要获取 上传文件的名字
					 */
					//获取路径名
					String value1 = item.getName() ;
					//索引到最后一个反斜杠
					int start = value1.lastIndexOf("\\");
					//截取 上传文件的 字符串名字,加1是 去掉反斜杠,
					String filename = value1.substring(start+1);									
					//真正写到磁盘上
					//它抛出的异常 用exception 捕捉					
					//item.write( new File(path,filename) );//第三方提供的					
					//手动写的
					OutputStream out = new FileOutputStream(new File(path,filename));	
					realpath[i]=filename;
					i++;
					InputStream in = item.getInputStream() ;
					int length = 0 ;
					byte [] buf = new byte[1024] ;					
					System.out.println("获取上传文件的总共的容量:"+item.getSize());
					// in.read(buf) 每次读到的数据存放在   buf 数组中
					while( (length = in.read(buf) ) != -1)
					{
						//在   buf 数组中 取出数据 写到 (输出流)磁盘上
						out.write(buf, 0, length);				    
					}
					
					in.close();
					out.close();
				}
			}
			num++;
			} catch (FileUploadException e) {
			e.printStackTrace();
		}
		catch (Exception e) {
			e.printStackTrace();
		}	
		
		try {
			int flag=st.executeUpdate("insert "+newstype+" values('"+num+"','"+value[0]+"','"+value[1]+"','"+realpath[0]+"','"+realpath[1]+"','"+realpath[2]+"','"+realpath[3]+"','"+realpath[4]+"','"+realpath[5]+"','"+realpath[6]+"','"+time+"')");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		//request.getRequestDispatcher("Home.jsp?id="+realpath[0]+"&id1="+realpath[1]+"&id2="+realpath[2]+"&id3="+realpath[3]+"&id4="+realpath[4]+"&id5="+realpath[5]+"&id6="+realpath[6]).forward(request, response);
		response.sendRedirect("NewsDisplay.jsp?id="+realpath[0]+"&id1="+realpath[1]+"&id2="+realpath[2]+"&id3="+realpath[3]+"&id4="+realpath[4]+"&id5="+realpath[5]+"&id6="+realpath[6]+"&time="+time+"&flag=1");
	}
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值