servlet实现文件上传和下载

菜鸟学习中,希望大家能多提意见,看看我编程有哪些问题,什么都可以提。。。。

 

 

1.index.jsp中 

 

<body>
   <form name = "form1"action ="uploadservlet" method ="post" enctype="multipart/form-data">
     文件上传:<input type ="file" name ="file1">
     <input type ="submit" value ="开始上传">
   </form>
   <form name ="form2" action ="selectservlet" method ="post">
     文件名:<input type ="text" name ="text"/>
     <input type ="submit" value ="查询">
   </form>
  </body>

点击“开始上传”时,提交FORM表单,根据uploadservlet在web.XML中的配置找到相应的servlet

2.web.xml

 

  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>uploadservlet</servlet-name>
    <servlet-class>allservlet.uploadservlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>uploadservlet</servlet-name>
    <url-pattern>/uploadservlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>selectservlet</servlet-name>
    <url-pattern>/selectservlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>downloadservlet</servlet-name>
    <url-pattern>/downloadservlet</url-pattern>
  </servlet-mapping>

 

3.uploadservlet

 

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  System.out.println("!!!!上传开始!!!!!!!!action");
  response.setCharacterEncoding("gb2312");
  boolean bool = false;
     PrintWriter out=response.getWriter();
     try {
     DiskFileUpload fu = new DiskFileUpload();

  // 设置允许用户上传文件大小,单位:字节,这里设为2m
  fu.setSizeMax(2*1024*1024);
  // 设置最多只允许在内存中存储的数据,单位:字节
  fu.setSizeThreshold(4096);
  // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
  fu.setRepositoryPath("c://windows//temp");
  //开始读取上传信息
  List fileItems = null;
 try {
  fileItems = fu.parseRequest(request);
 } catch (FileUploadException e1) {
  // TODO Auto-generated catch block
  e1.printStackTrace();
 }
  // 依次处理每个上传的文件
    Iterator iter = fileItems.iterator();

// 正则匹配,过滤路径取文件名
    String regExp=".+(.+)$";

// 过滤掉的文件类型
 String[] errorType={".exe",".com",".cgi",".asp"};
 // java.util.regex.Pattern是正则表达式编译后的表达法
 //下面的语句将创建一个Pattern对象并赋值给句柄p
 //Pattern 不能被new出来
    Pattern p = Pattern.compile(regExp);
       while (iter.hasNext()) {
        FileItem item = (FileItem)iter.next();
        //忽略其他不是文件域的所有表单信息
        if (!item.isFormField()) {
            String name = item.getName();
            long size = item.getSize();
            System.out.println("文件名:"+name+"长度:"+size);
            if((name==null||name.equals("")) && size==0)
                continue;
     //p.matcher(str)表示以用模板p去生成一个字符串str的匹配器,它的返回值是一个Matcher类的引用
        Matcher m = p.matcher(name);
        boolean result = m.find();
        System.out.println("Matcher m测试m.group(1)是什么意思:m.group(1)="+m.group(1));
        System.out.println("Matcher m测试m.group(0)是什么意思:m.group(0)="+m.group(0));
        if (result){
            for (int temp=0;temp<errorType.length;temp++){
            if (m.group(1).endsWith(errorType[temp])){
                  throw new IOException(name+": wrong type");
            }
            }
            try{

// 保存上传的文件到指定的目录

// 在下文中上传文件至数据库时,将对这里改写
              item.write(new File("d://" + m.group(1)));
              System.out.println("上传结束");
              accessDB adb =new accessDB();
             bool = adb.insertSQL(m.group(1),size);

            out.print(name+"&nbsp;&nbsp;"+size+"<br>");
            }
            catch(Exception e){
              out.println(e);
            }

         }
        else
        {
          throw new IOException("fail to upload");
        }
      }
    }
  }finally{
  
  }
  if(bool=true){
   RequestDispatcher rd =request.getRequestDispatcher("/uploadsuccess.jsp");
   rd.forward(request, response);
  }
 }

上传功能完成,并把文件信息放入了DB中,已Mysql为例:

package dbconnection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Date;

import javabean.All_file;

import com.mysql.jdbc.ResultSet;
import com.mysql.jdbc.Statement;

public class accessDB {
 Connection conn =null;
 Statement sta =null;
 public accessDB() throws ClassNotFoundException, SQLException{
  Class.forName("com.mysql.jdbc.Driver");
  String userName ="root";
  String password ="root";
  String url ="jdbc:mysql://localhost:3306/upload_db";
  conn=DriverManager.getConnection(url,userName,password);
  conn.setAutoCommit(false);
  sta =(Statement) conn.createStatement();
 }
 
 public String selectById(int id){
  System.out.println("11111");
  String sql ="select file_name from all_file where file_id = "+id+"";
  System.out.println("22222");
  String name ="";
  ResultSet res =null;
  try {
   res = (ResultSet) sta.executeQuery(sql);
//   if(res==null){
//    System.out.println("没有结果");
//   }
   while(res.next()&&res!=null){
    name =res.getString("file_name");
    System.out.println(name);
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  return name;
 }
 
 
 public boolean insertSQL(String name,long size){
  boolean bool =false;
  String sql ="insert into all_file(file_name,file_size)values('"+name+"', "+size+")";
  try {
   bool = sta.execute(sql);
   conn.commit();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return bool;
 }
 
 public All_file[] selectSQL(String name){
  String sql ="select * from all_file where file_name like '%"+name+"%'" ;
  ResultSet res =null;
   All_file[] afile =null;
  try {
   res = (ResultSet) sta.executeQuery(sql);
   res.last();
   int i=0;
   int j =res.getRow();
   System.out.println("数组的长度:"+j);
   afile = new All_file[j];
   res.first();
   System.out.println("回复:"+res.getRow());
   //res.first();
   //int i =res.getRow();
   //System.out.println("i的值:"+i);
   //res.next();
   //System.out.println(res.getRow());
   System.out.println("~~~~~~~~~");
   while(i<j){
    System.out.println("i的值:"+i+"file_id:"+res.getInt("file_id")+"file_name:"+res.getString("file_name")+"file_size:"+res.getInt("file_size"));
    afile[i] = new All_file(res.getInt("file_id"),res.getString("file_name"),res.getInt("file_size"));
    i++;
    res.next();
   }
   /*
   while(res!=null&&res.next()){
    afile =new All_file(res.getInt("file_id"),res.getString("file_name"),res.getInt("file_size"));
   }*/
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  return afile;
 }
}

 

 

查询到页面上后,自动生成表格,选择一项进行下载:

 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  int fileid =0;
  if(request.getParameter("radio")==null){
   fileid =0;
  }else{
   fileid =Integer.parseInt(request.getParameter("radio"));
  }
  System.out.println("根据id查询name的id="+fileid);
  String fileName = null;
  accessDB adb = null;
  try {
   adb = new accessDB();
   fileName = adb.selectById(fileid);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  System.out.println("查询出的文件名:"+fileName);
  
  
  String path ="d:/";
//  response.setContentType(" text/plain ");
//        OutputStream outputStream = null;
//        try {
//            outputStream = response.getOutputStream();
//            //把文件路径为srcFile的文件写入outputStream中
//            popFile(path, outputStream) ;
//        } catch (IOException e) {
//            e.printStackTrace();   
//     }
  response.setContentType("APPLICATION/OCTET-STREAM");  
  response.setHeader("Content-Disposition","attachment;filename=/""+fileName + "/"");  
       
  //   打开指定文件的流信息  
  java.io.FileInputStream fileInputStream = new java.io.FileInputStream(path + fileName);  
           
  //   写出流信息  
  int i;  
  OutputStream out = response.getOutputStream();
  while((i=fileInputStream.read())!=-1)   {  
       out.write(i);  
     }  
  fileInputStream.close();  
  out.close();  
 }

结束了~~~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值