- 浏览: 8179 次
- 性别:
- 来自: 武汉
最新评论
上传类:SeesvUpload.java
上传jsp页面:FileUpload.jsp
处理页面:uploadtest.jsp
package org.seesv.upload; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import java.sql.SQLException; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.PageContext; /** * 上传组件 * 2008-08-28 * QQ:296128761 * @author linqw */ public class SeesvUpload { //请求参数 protected ServletContext m_application; protected HttpServletRequest m_request; protected HttpServletResponse m_response; //一般操作参数 private long m_totalMaxFileSize; //设定允许上传的文件的总长度 private Vector m_allowedFilesList; //设定允许上传带有指定扩展名 private Vector m_deniedFilesList; //限制上传那些带有指定扩展名 private long m_maxFileSize; //每个文件允许上传的最大长度 private int m_totalBytes; //上传数据的总字节数 protected byte[] m_binArray; //创建byte数组,保存上传文件的数据 private int m_currentIndex; //字符操作与分割位置标识 private String m_boundary; //保存头部以上部份 private Hashtable fileHash; //存类文件 private int fileCount; //上传文件总数 private int m_startData; //文件数据开始 private int m_endData; //文件数据结束 UpFile upFile; //上传文件操作文件 /** * 用于初始化参数 */ public SeesvUpload() { fileHash=new Hashtable(); fileCount=0; m_allowedFilesList = new Vector(); m_deniedFilesList = new Vector(); m_maxFileSize = 0L; m_totalMaxFileSize = 0L; m_totalBytes = 0; m_currentIndex = 0; m_boundary = new String(); m_startData=0; m_endData=0; } /** * 初始化 -- ServletContext; * @param servletconfig * @throws ServletException */ public final void init(ServletConfig servletconfig) throws ServletException { m_application = servletconfig.getServletContext(); } /** * 初始化请求---- request ,response ,ServletContext; * @param httpservletrequest 请求request * @param httpservletresponse 响应response * @throws ServletException * @throws IOException */ public void service(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse) throws ServletException, IOException { m_request = httpservletrequest; m_response = httpservletresponse; } /** * 初始化请求---- request ,response ,ServletContext; * @param httpservletrequest 请求request * @param httpservletresponse 响应response * @throws ServletException * @throws IOException */ public final void initialize(ServletConfig servletconfig, HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse) throws ServletException { m_application = servletconfig.getServletContext(); m_request = httpservletrequest; m_response = httpservletresponse; } /** * 初始化请求---- request ,response ,ServletContext; * @param httpservletrequest * @param httpservletresponse * @throws ServletException * @throws IOException */ public final void initialize(PageContext pagecontext) throws ServletException { m_application = pagecontext.getServletContext(); m_request = (HttpServletRequest)pagecontext.getRequest(); m_response = (HttpServletResponse)pagecontext.getResponse(); } /** * 设定允许上传带有指定扩展名的文件,当上传过程中有文件名不允许时,组件将抛出异常 * @param s 允许上传文件格式 */ public void setAllowedFilesList(String s) { if(s != null) { String s2 = ""; for(int i = 0; i < s.length(); i++) { if(s.charAt(i) == ',') { if(!m_allowedFilesList.contains(s2)) { m_allowedFilesList.addElement(s2); } s2 = ""; } else { s2 = s2 + s.charAt(i); } } if(s2 != "") { m_allowedFilesList.addElement(s2); } } else { m_allowedFilesList = null; } } /** * 用于限制上传那些带有指定扩展名的文件.若有文件扩展名被限制,则上传时组件将抛出异常. * @param s 限制上传文件格式 */ public void setDeniedFilesList(String s) throws ServletException, IOException, SQLException { if(s != null) { String s2 = ""; for(int i = 0; i < s.length(); i++) { if(s.charAt(i) == ',') { if(!m_deniedFilesList.contains(s2)) { m_deniedFilesList.addElement(s2); } s2 = ""; } else { s2 = s2 + s.charAt(i); } } if(s2 != "") { m_deniedFilesList.addElement(s2); } } else { m_deniedFilesList = null; } } /** * 设定每个文件允许上传的最大长度 * @param l 为每个文件允许上传的最大长度,当文件超出此长度时,将不被上传 */ public void setMaxFileSize(long l) { m_maxFileSize = l; } /** * maxFileSize为为每个文件允许上传的最大长度,当文件超出此长度时,将不被上传。 * @param l 允许上传的最大长度 */ public void setTotalMaxFileSize(long l) { m_totalMaxFileSize = l; } /** * 上传组件 * @throws ServletException * @throws IOException * @throws SmartUploadException */ public void upload() throws ServletException, IOException { boolean flag1 = false; m_totalBytes = m_request.getContentLength(); m_binArray = new byte[m_totalBytes]; /* int j; //将字符节保存到数组中---1.SmartUpload 写法 for(; i < m_totalBytes; i += j) { try { j = m_request.getInputStream().read(m_binArray, i, m_totalBytes - i); } catch(Exception exception) { throw new SeesvUploadException("Unable to upload."); } } */ //将字任节保存到数组中 int byteRead = 0; int totalBytesRead = 0; // 将上传的数据保存在byte数组 while (totalBytesRead < m_totalBytes) { byteRead = m_request.getInputStream().read(m_binArray, totalBytesRead, m_totalBytes); totalBytesRead += byteRead; } for(; !flag1 && m_currentIndex < m_totalBytes; m_currentIndex++) { if(m_binArray[m_currentIndex] == 13) { flag1 = true; } else { m_boundary = m_boundary + (char)m_binArray[m_currentIndex]; } } if(m_currentIndex == 1) { return; } //各参数作用--> String s3= new String();; //获取上传的文件框名字 file 名字 如: file:name="File1" s3=File1 String s4= new String();; //获取上传文件文件名 如: 想你的天空.txt String s5= new String();; //获取上传文件的后缀名 如: txt String s6= new String();; //获取上传文件绝对路径,即文件框的值 如: C:\Documents and Settings\Administrator\桌面\想你的天空.txt String s7= new String();; //获取上传文件的数据类型 String s8= new String();; //获取数据类型描述 Content-Disposition String s9= new String();; //获取上传内容解析 String s10= new String(); //获取上传内容解析 long l = 0L; //总共字符节长度 for(m_currentIndex++; m_currentIndex < m_totalBytes; m_currentIndex = m_currentIndex + 2) { String s1 = getDataHeader(); //获取头部 m_currentIndex = m_currentIndex + 2; boolean flag3 = s1.indexOf("filename") > 0; s3 = getDataFieldValue(s1, "name"); //获取上传的文件名 file 名字 if(flag3) { s6=getDataFieldValue(s1, "filename"); s4=getFileName(s6); s5=getFileExt(s4); s7=getContentType(s1); s8=getContentDisp(s1); s9=getTypeMIME(s7); s10=getSubTypeMIME(s7); } getDataSection(); //用于验证传东西是否条件..不合条件直接抛出异常 if(flag3 && s4.length() > 0) { //限制后缀名. if(m_deniedFilesList.contains(s5)) { throw new SecurityException("限制上传后缀名:"+m_deniedFilesList.toString()); } if(!m_allowedFilesList.isEmpty() && !m_allowedFilesList.contains(s5)) { throw new SecurityException("只允许上传文件后缀名:->"+m_allowedFilesList); } if(m_maxFileSize > 0L && (long)((m_endData - m_startData) + 1) > m_maxFileSize) { throw new SecurityException("允许上传最大字节数 : "+m_maxFileSize ); } l+=(m_endData - m_startData) + 1; if(m_totalMaxFileSize > 0L && l > m_totalMaxFileSize) { throw new SecurityException("上传文件超过指定的大小,指定长度为:"+m_totalMaxFileSize); } if(s7.indexOf("application/x-macbinary") > 0) { m_startData = m_startData + 128; } } if(flag3) { upFile=new UpFile(); upFile.init(this,s3,s4,s5,s6 ,s6.length() == 0,s7,s8, s9,s10,(m_endData - m_startData) + 1); upFile.setStartData(m_startData); upFile.setEndData(m_endData); byte[] saveBinArray=getBinArray(m_startData,m_endData); upFile.setSaveBinArray(saveBinArray); if(s4.length()>0) { addUploadFile(upFile); } } else { String s11 = new String(m_binArray, m_startData, (m_endData - m_startData) + 1); //添加参数 upFile.putParameter(s3, s11); } if((char)m_binArray[m_currentIndex + 1] == '-') { break; } } } public void addUploadFile(UpFile upFile) { fileHash.put(new Integer(fileCount), upFile); fileCount++; return; } public UpFile getFile(int i) { return (UpFile)fileHash.get(i); } public int getFileCount(){ return fileCount; } /** * 用于数组转移 * @param startBin 开始位置 * @param endBin 结束位置 * @return */ public byte[] getBinArray(int startBin,int endBin){ byte[] saveBinArray=new byte[(endBin - startBin)+1]; for(int i=0;i<(endBin - startBin)+1;i++) { saveBinArray[i]=m_binArray[startBin+i]; } return saveBinArray; } /** * *获取文件数据集 */ private void getDataSection() { int i = m_currentIndex; int j = 0; int k = m_boundary.length(); m_startData = m_currentIndex; m_endData = 0; while(i < m_totalBytes) { if(m_binArray[i] == (byte)m_boundary.charAt(j)) { if(j == k - 1) { m_endData = ((i - k) + 1) - 3; break; } i++; j++; } else { i++; j = 0; } } m_currentIndex = m_endData + k + 3; } /** * @return 上传文件头 * 如:Content-Disposition: form-data; name="FILE1"; * filename="路径文件" Content-Type: text/plain */ private String getDataHeader() { int i = m_currentIndex; int j = 0; for(boolean flag1 = false; !flag1;) { if(m_binArray[m_currentIndex] == 13 && m_binArray[m_currentIndex + 2] == 13) { flag1 = true; j = m_currentIndex - 1; m_currentIndex = m_currentIndex + 2; } else { m_currentIndex++; } } String s = new String(m_binArray, i, (j - i) + 1); return s; } /** * 获取上传文件框的File名字 * @param s 头部信息 * @param ns 获取值的对应--key * @return 文件框的名字 */ private String getDataFieldValue(String s,String ns) { String s1=new String(); String s3=new String(); s1=ns+"="+"\""; int i=s.indexOf(s1); if(i>0) { int j = i + s1.length(); int k = j; s1 = "\""; int l = s.indexOf(s1, j); if(k > 0 && l > 0) { s3 = s.substring(k, l); } } return s3; } /** * 比方文件路径是C:\Documents and Settings\Administrator\桌面\MM.txt *@param s 文件路径 *@return 返回文件名 则返回 MM.txt */ private String getFileName(String s){ int i=0; i=s.lastIndexOf("/"); if(i!=-1){ return s.substring(i+1,s.length()); } i=s.lastIndexOf("\\"); if(i!=-1){ return s.substring(i+1,s.length()); } else{ return s; } } /** * 如:想你的日子.txt 返回txt; * @param s 文件名 * @return 后缀名 */ private String getFileExt(String s) { if(s==null||s.equals("")) { return null; } int i=s.lastIndexOf("."); if(i==-1){ return null; }else { return s.substring(i+1,s.length()); } } /** * 返回数据类型 *@param s 头部信息 *@return 返回数据类型 */ private String getContentType(String s) { String s1=new String(); s1 = "Content-Type:"; int i=s.indexOf(s1)+s1.length(); if(i==-1) { return null; }else { return s.substring(i+1,s.length()); } } /** * 文件内容描述 * @param s 头部信息 * @return Content-Disposition 内容描述 */ private String getContentDisp(String s) { int i=s.indexOf(":"); int j=s.indexOf(";"); if(s==null) { return null; } if(i==-1||j==-1) { return null; } else { return s.substring(i+2,j); } } /** *@param s 内容类型 *@return 内容类型解析 */ private String getTypeMIME(String s) { int i = 0; i = s.indexOf("/"); if(i != -1) { return s.substring(0, i); } else { return s; } } /** * * @param s 内容类型 * @return 类型 */ private String getSubTypeMIME(String s) { int i = 0; i = s.indexOf("/") + 1; if(i != -1) { int j = s.length(); return s.substring(i, j); } else { return s; } } public UpFile getInitFiles(){ return upFile; } /** * 内部类 * 用于文件其他操作 比方,上传操作.参数等 */ public class UpFile { private SeesvUpload sessvUpload; //Upload类 private String fieldName; //文件框名 private String fileName; //文件名 private String fileExtValue; //文件后缀 private String filePathValue; //文件路径值 private boolean filePathFalg; //判断文件路径是否有值 private String contentType; //内容类型 private String contentDisp; //数据类型描述 private String typeMIME; //内容类型解析 private String subTypeMIME; //内容类型解析 private int fileSize; //文件大小 private int startData; //1个文件开始位置 private int endData ; //1个文件结束位置 private byte[] saveBinArray; //保存字节长度 private Hashtable m_parameters; //存放参数 private int m_counter; //参数个数 /** * 内部初始化方法 */ public UpFile() { m_parameters=new Hashtable(); m_counter=0; } /** * 初始化所有参数 */ public void init(SeesvUpload sessvUpload ,String fieldName ,String fileName ,String fileExtValue ,String filePathValue ,boolean filePathFalg ,String contentType ,String contentDisp , String typeMIME ,String subTypeMIME ,int fileSize) { this.sessvUpload=sessvUpload; this.fieldName=fieldName; this.fileName=fileName; this.fileExtValue=fileExtValue; this.filePathValue=filePathValue; this.filePathFalg=filePathFalg; this.contentType=contentType; this.contentDisp=contentDisp; this.typeMIME=typeMIME; this.subTypeMIME=subTypeMIME; this.fileSize=fileSize; } /** * 存放上传参数 * @param s 键--如:文本框名 * @param s1 值--如:文本框值 */ protected void putParameter(String s, String s1) { if(s == null) { throw new IllegalArgumentException("The name of an element cannot be null."); } if(m_parameters.containsKey(s)) { Hashtable hashtable = (Hashtable)m_parameters.get(s); hashtable.put(new Integer(hashtable.size()), s1); } else { Hashtable hashtable1 = new Hashtable(); hashtable1.put(new Integer(0), s1); m_parameters.put(s, hashtable1); m_counter++; } } /** * 保存文件 */ public void saveUpFile(String s) { try{ File fileName=new File(s); //创建文件写出类 FileOutputStream fileOut = new FileOutputStream(fileName); //保存文件数据 fileOut.write(saveBinArray); fileOut.close(); } catch(Exception be) { System.out.println("保存出错异常:-->"+be.getMessage()); } } /** * 用于获取参数 * @param s 查找key 参数名 * @return 值 参数值 */ public String getParameter(String s) { if(s == null) { throw new IllegalArgumentException("上传时有键名不存在,请查看页面From内容"); } Hashtable hashtable = (Hashtable)m_parameters.get(s); if(hashtable == null) { return null; } else { return (String)hashtable.get(new Integer(0)); } } /** * * @return 所有key 即参数值 */ public Enumeration getParameterNames() { return m_parameters.keys(); } /** * * @param s 返回同名的所有值. 比方提交的是checkbox 这个东西.就用这个 * @return 返回值 */ public String[] getParameterValues(String s) { if(s == null) { throw new IllegalArgumentException("上传时有键名不存在,请查看页面From内容"); } Hashtable hashtable = (Hashtable)m_parameters.get(s); if(hashtable == null) { return null; } String as[] = new String[hashtable.size()]; for(int i = 0; i < hashtable.size(); i++) { as[i] = (String)hashtable.get(new Integer(i)); } return as; } /** *上传返回 * @return 返回基本信息 */ public String getContentDisp() { return contentDisp; } public String getContentType() { return contentType; } public String getFieldName() { return fieldName; } public String getFileExtValue() { return fileExtValue; } public String getFileName() { return fileName; } public boolean isFilePathFalg() { return filePathFalg; } public String getFilePathValue() { return filePathValue; } public int getFileSize() { return fileSize; } public SeesvUpload getSessvUpload() { return sessvUpload; } public String getSubTypeMIME() { return subTypeMIME; } public String getTypeMIME() { return typeMIME; } public int getEndData() { return endData; } public void setEndData(int endData) { this.endData = endData; } public int getStartData() { return startData; } public void setStartData(int startData) { this.startData = startData; } public byte[] getSaveBinArray() { return saveBinArray; } public void setSaveBinArray(byte[] saveBinArray) { this.saveBinArray = saveBinArray; } } }
上传jsp页面:FileUpload.jsp
<%@ page contentType="text/html; charset=GBK" %> <html> <head> <title>多个文件上载示例</title> </head> <body> <h3>多个文件上载示例</h3> <form method="post" action="uploadtest.jsp" enctype="multipart/form-data"> <input type="FILE" name="FILE1" size="50"><br> <input type="FILE" name="FILE2" size="50"><br> <input type="text" size="12" name="text1"><br> <input type="text" size="12" name="text2"><br> <input type="text" size="12" name="text3"><br> <input type="submit" value="上载文件"> </form> </body> </html>
处理页面:uploadtest.jsp
<%@ page language="java" import="org.seesv.upload.SeesvUpload,java.io.*,java.util.*" contentType="text/html; charset=gb2312"%> <% SeesvUpload su=new SeesvUpload(); su.initialize(config,request,response); su.setTotalMaxFileSize(2322342); su.setAllowedFilesList("doc,php,txt,pdf,xls"); su.setDeniedFilesList("jsp,asp,tmp"); su.upload(); for(int i=0;i<su.getFileCount();i++) { su.getFile(i).saveUpFile("c:\\"+su.getFile(i).getFileName()); // out.println("文件长度:======>"+su.getFile(i).getSaveBinArray().length); out.println("文件路径:--->"+su.getFile(i).getFilePathValue()); } //取得上传参数的名字集合 Enumeration e =su.getInitFiles().getParameterNames(); //逐个显示参数的值 while (e.hasMoreElements()) { //取得单个参数的名字 String key = (String) e.nextElement(); //取得参数的值集合 String[] values = su.getInitFiles().getParameterValues(key); for (int i = 0; i < values.length; i++) { out.print("<p>" + key + " = " + values[i] + "</p>"); } } %>
- mytest01.rar (15.2 KB)
- 描述: 原代码
- 下载次数: 30
相关推荐
综合以上分析,这个“做自已的网盘”系统是一个基于ASP.NET开发的,集成了用户管理、文件上传下载、共享权限控制等功能的本地网络存储解决方案。其设计考虑到了易用性和安全性,适合那些希望在内部网络环境中搭建...
新的IO组件在处理磁盘中的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件...
新的IO组件在处理磁盘中的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件...
新的IO组件在处理磁盘中的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件...
新的IO组件在处理磁盘中的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件...
4,无组件图片上传功能。(还可以上传软件哦!)jpg/gif/rar/zip。 5,有组件软件上传功能,(速度真的很快耶!)推荐使用组件。 6,验证码其实还没有做好。在首页只是摆个样子。以后有时间会修正的。 ...
2)修正了文件有时不能上传的错误并改用新的上传组件使上传文件更加?的安全快速。3)放弃普通UBB显示改用流行的网页在线编辑器。4)修正了一些其它的错误。 后台管理: /admin/login.asp 用户名:admin 密码:...
2)修正了文件有时不能上传的错误并改用新的上传组件使上传文件更加?的安全快速。3)放弃普通UBB显示改用流行的网页在线编辑器。4)修正了一些其它的错误。登陆后台:123.ASP帐号:ADMIN密码:3891212
测试服务器组件情况:测试IIS自带,常用文件上传、收发邮件、图像处理等组件,和自定义组件的支持情况。 测试服务器运算能力:让服务器执行50万次加法(整数运算)和20万次开方(浮点运算),记录其所使用的...
"home_diy02" 和 "diy02a" 这两个文件名可能是模板中的两个主要部分,其中 "home_diy02" 很可能是首页的设计文件,而 "diy02a" 可能代表模板的另一种变体或者是一个附加的页面或组件。 在 Destoon 中,模板通常包括...
缩略图:上传图片结合aspjpeg组件可生成大图与小图及自定义水印位置,无限制上传图片。 图片展示:结合lightbox插件多图展示。 询盘管理:客户留言及询盘都可自动发送自已定义的邮箱及后台的询盘管理中。 ...
缩略图:上传图片结合aspjpeg组件可生成大图与小图及自定义水印位置,无限制上传图片。 图片展示:结合lightbox插件多图展示。 询盘管理:客户留言及询盘都可自动发送自已定义的邮箱及后台的询盘管理中。 联系方式:...
特别声明:由于联系不上原作者,此版本为自已在修复老项目时,顺带修复了该组件的部份错误. 为了方便维护老项目的网友们,故此发布修正的版本(更新版本号的目的仅为方便标识不同版本).此源码仅供自行学习研究使用,本人...
缩略图:上传图片结合aspjpeg组件可生成大图与小图及自定义水印位置,无限制上传图片。 图片展示:结合lightbox插件多图展示。 询盘管理:客户留言及询盘都可自动发送自已定义的邮箱及后台的询盘管理中。 联系方式:...
缩略图:上传图片结合aspjpeg组件可生成大图与小图及自定义水印位置,无限制上传图片。 图片展示:结合lightbox插件多图展示。 询盘管理:客户留言及询盘都可自动发送自已定义的邮箱及后台的询盘管理中。 联系...
特别声明:由于联系不上原作者,此版本为自已在修复老项目时,顺带修复了该组件的部份错误. 为了方便维护老项目的网友们,故此发布修正的版本(更新版本号的目的仅为方便标识不同版本).此源码仅供自行学习研究使用,本人...
缩略图:上传图片结合aspjpeg组件可生成大图与小图及自定义水印位置,无限制上传图片。 图片展示:结合lightbox插件多图展示。 询盘管理:客户留言及询盘都可自动发送自已定义的邮箱及后台的询盘管理中。 联系方式:...
缩略图:上传图片结合aspjpeg组件可生成大图与小图及自定义水印位置,无限制上传图片。 图片展示:结合lightbox插件多图展示。 询盘管理:客户留言及询盘都可自动发送自已定义的邮箱及后台的询盘管理中。 联系...
4、采用最新版xhEditor编辑器,xhEditor是一个基于jQuery开发的跨平台开源迷你XHTML编辑器组件。 5、可批量删除,审核留言,留言IP归属地查询等。 安装说明: 1、下载本系统后,解压压缩包后,用记事本等工具打开...