1 import javax.servlet.*; 2 import javax.servlet.http.*; 3 import java.io.*; 4 import java.util.*; 5 import java.util.regex.*; 6 import org.apache.commons.fileupload.*; 7 8 public class upload extends HttpServlet { 9 private static final String CONTENT_TYPE = "text/html; charset=UTF-8"; 10 //Process the HTTP Post request 11 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 12 response.setContentType(CONTENT_TYPE); 13 PrintWriter out=response.getWriter(); 14 try { 15 DiskFileUpload fu = new DiskFileUpload(); 16 // 设置允许用户上传文件大小,单位:字节,这里设为2m 17 fu.setSizeMax(2*1024*1024); 18 // 设置最多只允许在内存中存储的数据,单位:字节 19 fu.setSizeThreshold(4096); 20 // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录 21 fu.setRepositoryPath("c://windows//temp"); 22 //开始读取上传信息 23 List fileItems = fu.parseRequest(request); 24 // 依次处理每个上传的文件 25 Iterator iter = fileItems.iterator(); 26 27 //正则匹配,过滤路径取文件名 28 String regExp=".+////(.+)$"; 29 30 //过滤掉的文件类型 31 String[] errorType={".exe",".com",".cgi",".asp"}; 32 Pattern p = Pattern.compile(regExp); 33 while (iter.hasNext()) { 34 FileItem item = (FileItem)iter.next(); 35 //忽略其他不是文件域的所有表单信息 36 if (!item.isFormField()) { 37 String name = item.getName(); 38 long size = item.getSize(); 39 if((name==null||name.equals("")) && size==0) 40 continue; 41 Matcher m = p.matcher(name); 42 boolean result = m.find(); 43 if (result){ 44 for (int temp=0;temp<ERRORTYPE.LENGTH;TEMP++){ 45 if (m.group(1).endsWith(errorType[temp])){ 46 throw new IOException(name+": wrong type"); 47 } 48 } 49 try{ 50 51 //保存上传的文件到指定的目录 52 53 //在下文中上传文件至数据库时,将对这里改写 54 item.write(new File("d://" + m.group(1))); 55 56 out.print(name+" "+size+""); 57 } 58 catch(Exception e){ 59 out.println(e); 60 } 61 62 } 63 else 64 { 65 throw new IOException("fail to upload"); 66 } 67 } 68 } 69 } 70 catch (IOException e){ 71 out.println(e); 72 } 73 catch (FileUploadException e){ 74 out.println(e); 75 } 76 77 } 78 } 79 80 现在介绍上传文件到服务器,下面只写出相关代码: 81 82 以sql2000为例,表结构如下: 83 84 字段名:name filecode 85 86 类型: varchar image 87 88 数据库插入代码为:PreparedStatement pstmt=conn.prepareStatement("insert into test values(?,?)"); 89 90 代码如下: 91 92 。。。。。。 93 94 try{ 95 这段代码如果不去掉,将一同写入到服务器中 96 //item.write(new File("d://" + m.group(1))); 97 98 int byteread=0; 99 //读取输入流,也就是上传的文件内容 100 InputStream inStream=item.getInputStream(); 101 pstmt.setString(1,m.group(1)); 102 pstmt.setBinaryStream(2,inStream,(int)size); 103 pstmt.executeUpdate(); 104 inStream.close(); 105 106 out.println(name+" "+size+" "); 107 }
原文:http://www.cnblogs.com/yangxu6069/p/4846095.html