使用properties文件配置数据库
MyEclipse 堆溢出设置

从表单上传文件到数据库或服务器

Jimmy posted @ 2012年3月10日 18:21 in JSP+MySQL , 4749 阅读

使用html表单上传文件,然后保存到数据库或服务器,使用Apache commons fileUpload组件来实现。组件下载地址:

common fileUpload: http://commons.apache.org/fileupload/index.html

commons io: http://commons.apache.org/io/

PS. 注意两个jar包都要导入

html代码:

<form enctype="multipart/form-data" id="form1" name="form1" action="UploadServlet" method="post">  
  
    <input type="file" id="uploadfile" name="uploadfile" />  
  
    <input type="text" name="column" />  
  
    <input type="submit" value="上传" name="submit">  
  
</form>  

1. 上传文件至数据库

		String[] errorType ={"exe","com","cgi","asp","jsp"};
		InputStream  inStream = null;
		int MAXSIZE = 5*1024*1024;	//文件大小限制为5M
		int errorType_int = 1;
		DiskFileUpload fu = new DiskFileUpload();
		fu.setSizeMax(MAXSIZE);
		fu.setSizeThreshold(MAXSIZE);
		fu.setRepositoryPath("D://temp");
	
		List fileItems = fu.parseRequest(request);
		Iterator iter = fileItems.iterator();
		String name = null; 
		long size = 0L;
		FileItem item = null;
		while(iter.hasNext())
		{
			item = (FileItem)iter.next();
			if (!item.isFormField())
     		{
        		name = item.getName();//获取上传的文件名
        		size = item.getSize();//获取上传的文件大小(字节为单位)
        		if(name == null || name.equals(""))
        		{
        			errorType_int = 0;
        			out.print("上传文件不能为空!"+"<br>");
        			break;
        		}
  				else if(size >= MAXSIZE)
  				{
  					errorType_int = 0;
  					out.println("文件大小超过5M"+"<br>");
  					break;
  				}
  				else
  				{
  					String suffix = name.substring(name.lastIndexOf('.'));
   					for (int temp=0; temp < errorType.length; temp++)
   					{
       					if (name != null && name.endsWith(errorType[temp]))
        				{
        					out.println(name+": 不允许上传此类型文件!<br>");
    						errorType_int = 0;
         				}
    				}
    				if(errorType_int != 0)
    					inStream=item.getInputStream(); 
    			}
  			}
  			else	//获取表单数据
  			{
  				if(item.getFieldName().equals("deadline"))
  					deadline = (String)item.getString();
  			}
		}//while
		//开始上传数据
    	if(errorType_int != 0)
    	{ 			
        	int byteread=0;
        	//读取输入流,也就是上传的文件内容
        	PreparedStatement pstmt=con.prepareStatement("insert into work_provide(Course_Id,Work_No,Work_Name,Work_quote,Work,Insert_Time,Deadline) values(?,?,?,?,?,?,?)");
        	pstmt.setString(1,Course_Id);
        	pstmt.setInt(2,Work_No); 
        	pstmt.setString(3,name);
        	pstmt.setInt(4,Work_Quote);
        	pstmt.setBinaryStream(5,inStream,(int)size);
        	pstmt.setString(6,dateString);
        	pstmt.setString(7,mdate);
        	pstmt.executeUpdate();
        	inStream.close();
			con.close();
		}
	}

这里获取上传文件的输入流,然后用PreparedStatement将文件保存到数据库

2. 上传文件到服务器

String fileDir = this.getServletContext().getRealPath("temp/");  
String localFileName = "";  
String serverFileName = "";  
String serverFilePath = "";  
if(ServletFileUpload.isMultipartContent(request)) {  
    DiskFileItemFactory factory = new DiskFileItemFactory(); // 基于磁盘文件项目创建一个工厂对象  
    //factory.setSizeThreshold(20*1024);  
    factory.setRepository(factory.getRepository());  
    ServletFileUpload upload = new ServletFileUpload(factory); // 创建一个新的文件上传对象  
    int size = 10*1024*1024;  // 最大上传文件,不超过10M  
    List formlists = null;  
    FileItem formitem;  
       try{  
           formlists = upload.parseRequest(request); // 解析上传请求  
       }catch(FileUploadException e){  
              e.printStackTrace();  
       }     
       Iterator iter = formlists.iterator(); // 枚举方法  
       while(iter.hasNext()) {  
           formitem = (FileItem)iter.next(); // 获取FileItem对象  
           if(!formitem.isFormField()) {     // 判断是否为文件域  
              if(formitem.getName()!=null && !formitem.getName().equals("")) { // 判断是否选择了文件  
                  long upFileSize = formitem.getSize(); // 上传文件大小  
                  if (upFileSize > size) {  
                     out.print("<script>alert('上传文件太大![<100M]')</script>");  
                     return;  
                  }     
                  localFileName = formitem.getName();   // 获取文件名  
                  int ii = localFileName.lastIndexOf(".");  
                  String sExt = localFileName.substring(ii,localFileName.length());//取文件名的后缀  
                  if ((!sExt.equals(".xls")) && (!sExt.equals(".xlsx"))) {  
                     out.print("<script>alert('请选择excel文件!')</script>");  
                     return;  
                  }  
                  //得到不重复的文件名,这一步是为了防止同时上传两个同文件名的excel而做的,避免文件名重复     
                  Date dt = new Date(System.currentTimeMillis());     
                  SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS");  
                  serverFileName = fmt.format(dt);      
                  serverFileName = serverFileName + sExt;     
                  //如果不存在该目录,则新建一个     
                  File dir =new File(fileDir);     
                  if (!dir.exists()) {     
                     dir.mkdirs();     
                  }  
                  serverFilePath = fileDir+"\\"+serverFileName;  
                  File serverFile = new File(serverFilePath);  
                  try {  
                     formitem.write(serverFile);  
                  }catch(Exception e) {  
                     e.printStackTrace();  
                  }   
              }else {                       
                  out.print("<script>alert('没有选择文件!')</script>");  
                  return;  
              }     
           }else {  
              try {  
                  if("column".equals(formitem.getFieldName())) {  
                     column = Integer.parseInt(formitem.getString("gb2312").trim());  
                         //System.out.println(column);  
                  }  
              }catch (NumberFormatException e) {  
                  e.printStackTrace();  
                  return;  
              }  
           }  
       }  

REF: http://yjandx.iteye.com/blog/1170356

Avatar_small
更改 说:
2015年6月08日 20:16

瑞特人热特特


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter