- 浏览: 1564588 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
nich002:
原网站失效了。撸主简单粗暴的复制过来,可读性极差!差评!
Apache配置详解(最好的APACHE配置教程) -
107x:
不错,谢谢!
LINUX下查看文件夹下的文件个数! -
Hypereo:
好你妹,连个格式都没有!
Apache配置详解(最好的APACHE配置教程) -
resteater:
代码排版感觉有点乱!收发信息代码可读性不强!请问第一次发服务器 ...
java socket例子 -
resteater:
代码排版感觉有点乱!收发信息代码可读性不强!请问第一次发服务器 ...
java socket例子
http://blog.csdn.net/kimmking/archive/2008/01/18/2051169.aspx
呵呵,学习一下。。。
当一个form表单 被设置为enctype="MULTIPART/FORM-DATA" method="post" 时,其中的〈input type="file" name="filename" /> 标签如果被用户 选择了文件的话. 浏览器会把 文件内容连同 form的所有字段 格式化后传递到服务器~~ 如下 一个测试: <!--f.jsp--> <%@ page contentType="text/html;charset=GB2312"%> <HTML> <BODY> <p>选择要上传的文件:<BR> <FORM action="accept.jsp" method="post" ENCTYPE="multipart/form-data"> <INPUT type=FILE name="boy" size="38"> <BR> <INPUT type="hidden" id="tt" name="t" value="1"> <INPUT type="submit" id="gg" name="g" value="提交"> </BODY> </HTML> 处理: [color=green] <!--accept.jsp--> <%@ page contentType="text/html;charset=GB2312"%> <%@ page import="java.io.*"%> <HTML> <BODY> <%try{InputStream in=request.getInputStream(); File f=new File("f:\\qin\\jsp","a.txt"); FileOutputStream o=new FileOutputStream(f); byte b[]=new byte[1024]; int n; while((n=in.read(b))!=-1) {o.write(b,0,n); } o.close(); in.close(); } catch(IOException ee){} out.print("文件已经上传"); %> </body> </HTML> [/color] accept.jsp 中从request流中读取所有字节保存为文本文件, 提交后 查看f:\qin\a.txt的内容如下: -----------------------------7d631c72a0204 Content-Disposition: form-data; name="boy"; filename="C:\Documents and Settings\goodday\My Documents\2005sn.txt" Content-Type: text/plain 安装方法 在“添加删除”里面选择删除"visual studio 2005",然后在打开的窗口中选择最后一项“添加注册码升级到正式版”,在里面输入下面的cd-key,然后点升级就OK了! SN:KYTYH-TQKW6-VWPBQ-DKC8F-HWC4J -----------------------------7d631c72a0204 Content-Disposition: form-data; name="t" 1 -----------------------------7d631c72a0204 Content-Disposition: form-data; name="g" 提交 -----------------------------7d631c72a0204-- 其中-----------------------------7d631c72a0204为 为字段间的分隔符; -----------------------------7d631c72a0204--为结束符. 分割符为42个字节, 前29个-,然后是浏览器标识,ie为7d,后面的11个随机的16进制一位数的字符. 以2进制的方式 获取request流后,就不能用getparameter(jsp)或form(asp) 的方式 读取参数的值了. 我们要重写 分析获取参数值的方法. form字段每一个参数的名称和值的格式为: Content-Disposition: form-data; name="t" 1 name="t" 为名称,两个\r\n(newline)后是其值 文件则是多一个filename=和一行Content-Type: text/plain 然后一样的2个newline后是2进制的 文件的所有内容 直到分割符... ------------------------ 分析了 这些原理 我们就可以 实现文件上传功能~~~ 就是 按分割符 读取request流; 然后 分析各段的 name和value 存入 hashtable; 如果是文件则 存入 文件. ----------------------------------- jsp的例子: 文件上传类:UploadBean.java package qin; import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class UploadBean { private String[] sourceFile = new String[255]; //源文件名 private String[] suffix = new String[255]; //文件后缀名 private String canSuffix = ".gif.jpg.jpeg.png.rar.txt"; //可上传的文件后缀名 private String objectPath = "f:/"; //目标文件目录 private String[] objectFileName = new String[255]; //目标文件名 private ServletInputStream sis = null; //输入流 private String[] description = new String[255]; //描述状态 private long size = 100 * 1024; //限制大小 private int count = 0; //已传输文件数目 private byte[] b = new byte[4096]; //字节流存放数组 private boolean successful = true; private Hashtable fields = new Hashtable(); public UploadBean() { } //设置上传文件的后缀名 public void setSuffix(String canSuffix) { this.canSuffix = canSuffix; } //设置文件保存路径 public void setObjectPath(String objectPath) { this.objectPath = objectPath; } //设置文件保存路径 public void setSize(long maxSize) { this.size = maxSize; } //文件上传处理程序 public void setSourceFile(HttpServletRequest request) throws IOException { sis = request.getInputStream(); int a = 0; int k = 0; String s = ""; while ( (a = sis.readLine(b, 0, b.length)) != -1) { s = new String(b, 0, a); if ( (k = s.indexOf("filename=\"")) != -1) { // 取得文件数据 s = s.substring(k + 10); k = s.indexOf("\""); s = s.substring(0, k); sourceFile[count] = s; k = s.lastIndexOf("."); suffix[count] = s.substring(k + 1); if (canTransfer(count)) { transferFile(count); } ++count; } else if ( (k = s.indexOf("name=\"")) != -1) { // 普通表单输入元素,获取输入元素名字 String fieldName = s.substring(k+6, s.length()-3); sis.readLine(b, 0, b.length); StringBuffer fieldValue = new StringBuffer(b.length); while ( (a = sis.readLine(b, 0, b.length)) != -1) { s = new String(b, 0, a-2); if ( (b[0] == 45) && (b[1] == 45) && (b[2] == 45) && (b[3] == 45) && (b[4] == 45)) { break; } else { fieldValue.append(s); } } fields.put(fieldName, fieldValue.toString()); } if (!successful) break; } } //取得表单元素值 public String getFieldValue(String fieldName) { if (fields == null ****** fieldName == null) { return null; } return (String) fields.get(fieldName); } //取得上传文件数 public int getCount() { return count; } //取得目标路径 public String getObjectPath() { return objectPath; } //取得源文件名 public String[] getSourceFile() { return sourceFile; } //取得目标文件名 public String[] getObjectFileName() { return objectFileName; } //取得上传状态描述 public String[] getDescription() { return description; } //判断上传文件的类型 private boolean canTransfer(int i) { suffix[i] = suffix[i].toLowerCase(); //这个是用来传图片的,各位可以把后缀名改掉或者不要这个条件 if (sourceFile[i].equals("") ****** (!(canSuffix.indexOf("."+suffix[i])>=0))) { description[i] = "ERR: File suffix is wrong."; return false; } else { return true; } } //上传文件转换 private void transferFile(int i) { String x = Long.toString(new java.util.Date().getTime()); try { objectFileName[i] = x + "." + suffix[i]; FileOutputStream out = new FileOutputStream(objectPath + objectFileName[i]); int a = 0; int k = 0; long hastransfered = 0; //标示已经传输的字节数 String s = ""; while ( (a = sis.readLine(b, 0, b.length)) != -1) { s = new String(b, 0, a); if ( (k = s.indexOf("Content-Type:")) != -1) { break; } } sis.readLine(b, 0, b.length); while ( (a = sis.readLine(b, 0, b.length)) != -1) { s = new String(b, 0, a); if ( (b[0] == 45) && (b[1] == 45) && (b[2] == 45) && (b[3] == 45) && (b[4] == 45)) { break; } out.write(b, 0, a); hastransfered += a; if (hastransfered >= size) { description[count] = "ERR: The file " + sourceFile[count] + " is too large to transfer. The whole process is interrupted."; successful = false; break; } } if (successful) { description[count] = "Right: The file " + sourceFile[count] + " has been transfered successfully."; } out.close(); if (!successful) { sis.close(); File tmp = new File(objectPath + objectFileName[count]); tmp.delete(); } } catch (IOException ioe) { description[i] = ioe.toString(); } } public static void main(String[] args) { System.out.println("Test OK"); } } 文件上传调用:Upload.jsp 〈%@ page contentType="text/html; charset=GB2312" %> 〈html> 〈head> 〈title>文件上载〈/title> 〈/head> 〈body> 〈form action="UploadSubmit.jsp" enctype="MULTIPART/FORM-DATA" method="post"> 作者姓名:〈input type="text" name="Author" /> 〈br /> 公司名称:〈input type="text" name="Company" /> 〈br /> 文件描述:〈input type="text" name="Comment" /> 〈br /> 选择文件1:〈input type="file" name="filename1" /> 〈br /> 选择文件2:〈input type="file" name="filename2" /> 〈br /> 选择文件3:〈input type="file" name="filename3" /> 〈br /> 选择文件4:〈input type="file" name="filename4" /> 〈br /> 〈input type="submit" value="上载" /> 〈/form> 〈/body> 〈/html> 文件上传提交:UploadSubmit.jsp 〈%@ page contentType="text/html;charset=gb2312"%> 〈jsp:useBean id="fileBean" scope="page" class="qin.UploadBean" /> 〈% fileBean.setObjectPath("D:\\"); fileBean.setSize(10000*1024); fileBean.setSuffix(".gif.jpg.png.jpge.html.htm"); fileBean.setSourceFile(request); String [] saSourceFile = fileBean.getSourceFile(); String [] saObjectFile = fileBean.getObjectFileName(); String [] saDescription = fileBean.getDescription(); int iCount = fileBean.getCount(); String sObjectPath = fileBean.getObjectPath(); for(int i=0;i〈iCount;i++) { out.println("〈br>源始文件:"); out.println(saSourceFile[i]); out.println("〈br>目标文件:"); out.println(sObjectPath+saObjectFile[i]); out.println("〈br>上传说明:"); out.println(saDescription[i]); out.println("〈br>"); } out.println("〈br>作者:" + fileBean.getFieldValue("Author")); out.println("〈br>公司:" + fileBean.getFieldValue("Company")); out.println("〈br>说明:" + fileBean.getFieldValue("Comment")); %>
评论
2 楼
liudaoru
2009-08-08
kimmking 写道
我考,竟然发现我多年前些的东西。
呵呵,学习一下。。。
1 楼
kimmking
2009-08-05
我考,竟然发现我多年前些的东西。
发表评论
-
JVM问题追查与调优
2012-03-27 14:44 1124JDK的几种分析工具 http://liudaoru ... -
NodeJs相关资料
2011-08-18 14:55 2967NodeJs获取参数: proces ... -
jprofiler追踪问题
2011-08-12 18:20 1028Jprofiler下载页: http://www.ej ... -
Linux服务器性能评估与优化【z】
2011-07-01 10:05 1523来自:http://www.itlearner.com/ ... -
Java 理论与实践: 非阻塞算法简介【z】
2011-03-26 20:39 1257From: http://www.ibm.com/develo ... -
Java Crash问题分析[z]
2011-03-23 14:41 5949参考: http://www.ibm.com/develop ... -
Berkeley DB相关
2010-09-25 22:17 1035为什么要使用Berkeley DB,它适合什么场合应用?Ber ... -
熟悉系统方法总结
2010-07-06 14:26 794了解一个陌生的系统是我们经常碰到的事情,下面总结一下自己的一些 ... -
Java缓存框架 EhCache
2010-07-06 14:09 4705From: http://www.oschina.net/p/ ... -
【nio】使用 ServerSocketChannel 实现的 File 服务器[z]
2010-05-21 17:31 3936From: http://www.java2000.net/p ... -
Memcached命令行管理
2010-03-15 11:18 4463From: http://www.exp2up.com/2 ... -
(转)Resin服务器配置指南
2010-01-21 15:35 3427From:http://blog.21cn.com/super ... -
Flickr架构
2010-01-11 09:52 1254From: http://www.cyask.com/ques ... -
JDK的几种分析工具
2009-12-04 12:13 10884From: http://blog.csdn.net/hant ... -
XMemcached——一个新的开源Java memcached客户端
2009-10-23 09:27 1873From: http://www.infoq.com/cn/ ... -
多线程任务调度学习
2009-10-16 13:58 2277昨天找到一套多线程任务调度的代码,相当的不错,先把思路总结一下 ... -
用HSCALE实现MySQL的数据分布式存储
2009-10-15 12:47 2991From:http://www.ningoo.net/ht ... -
马化腾:搜索、电子商务硬仗一定要坚持打
2009-10-15 12:09 1697From:http://www.techweb.com.c ... -
MySQL分表实现上百万上千万记录分布存储的批量查询设计模式【z】
2009-10-15 09:56 3153From:http://hi.baidu.com/jabber ... -
nginx负载均衡和lvs负载均衡的比较分析【z】
2009-10-13 20:02 1448From:http://www.shouker.com/u ...
相关推荐
分布式服务架构:原理、设计与实战 高清PDF,因上传文件大小限制,分割成了三个文件,全部下载放在同一目录下,即可成功解压,总共三部分:分布式服务架构:原理、设计与实战.zip 分布式服务架构:原理、设计与实战....
标题 "7z格式压缩 VC++源码包.7z" 提到的是一个使用7z压缩格式的文件,其中包含了VC++(Visual C++)的源代码。7z是一种高效的文件压缩格式,由7-Zip软件创建,具有较高的压缩比率和对多种压缩算法的支持。它允许...
首先,拖拽上传是HTML5引入的一项新特性,允许用户直接通过鼠标拖动文件到网页指定区域进行上传,极大地提升了文件上传的易用性。在"uploadcaesar_20190724"项目中,我们可以看到利用了这一特性,实现了无需额外配置...
标题中的“django-python.7z”表明这是一个与Python的Django框架相关的压缩包文件,通常包含教程、项目源代码或示例应用。Django是Python编程语言中的一个高级Web开发框架,它支持快速开发和干净、实用的设计。这个...
用户需要将这些文件上传到Z-Blog的相应目录,然后在后台设置中选择并应用该模版。 模版的定制可以从以下几个方面着手: 1. **颜色调整**:通过修改style.css中的颜色代码,可以改变模版的主题色,比如将背景色、...
【前端页面文件拖拽上传模块js代码示例】是一个实用的前端...总的来说,这个示例涵盖了前端开发中的多个重要概念,包括拖放交互、文件API、AJAX上传、DOM操作和UI设计,是学习和实践前端文件上传技术的一个良好起点。
《Z-BlogPHP_BAE_1_2:深入解析与应用》 Z-BlogPHP_BAE_1_2 是一个基于 PHP 的博客系统,专为百度应用引擎(BAE)优化设计的版本。这个压缩包提供了完整的源代码,旨在帮助用户快速搭建个人或企业博客,同时为初学...
标题中的“黑洞的一个demo.7z”指的是一...用户不仅可以观看演示,还可能参与其中,通过上传图片或查看源代码来了解背后的编程原理。这对于学习Web开发,尤其是前端动画和交互设计的初学者来说,是一个很好的实践案例。
2. 解压部署:将压缩包解压后,将文件上传至服务器的适当目录,并确保文件权限设置正确,以保证程序可以正常读写。 3. 数据库配置:在Ucenter的config/config.inc.php文件中,配置数据库连接信息,包括数据库类型、...
总之,"人脸识别.7z"提供的资源对于学习和实践人脸识别技术非常有价值,无论是理解人脸识别的基本原理,还是掌握虹软SDK的使用方法,都能从中受益。然而,要注意遵循非商业使用的规则,尊重知识产权。
在【lmc-1.2.16-src-zfg】这个压缩包中,包含了源代码文件,开发者可以通过阅读和学习这些代码来理解整个应用的工作原理,同时也可以作为开发类似功能的起点。源代码分析可以帮助深入理解Qt的网络编程、多线程以及...
2. 文件上传与下载:使用MultipartFile处理文件上传,OutputStream或ResponseEntity处理文件下载。 3. 拦截器:自定义Interceptor拦截请求,实现预处理和后处理功能。 4. RESTful API设计:使用@RequestMapping配合...
formBuilder是一个强大的在线表单构建工具,用于帮助用户轻松创建和设计...同时,对于学习表单设计和前端开发的人来说,这些材料也提供了丰富的实践素材,可以通过比较不同版本和组件来深入理解表单构建的原理和技巧。
在给定的资源中,"QFtp源码+VS2015项目文件+64位编译" 包含了QFtp的源代码,这对于理解其内部工作原理或者定制特定功能非常有用。 首先,QFtp源码可以帮助我们深入理解FTP通信的细节。通过阅读和分析源代码,我们...
《MultiFuncShield 多功能板:...通过对原理图的深入研究和参考程序的实践,开发者可以不断挖掘其潜力,创造出更多有趣的项目。无论你是新手还是经验丰富的工程师,MultiFuncShield都将是你Arduino旅程中的得力助手。
你可以用它来访问 Web API,下载或上传文件,甚至实现网页抓取。 2. **FTP 功能**:通过 FTP 组件,开发者可以进行文件的上传、下载、列出目录、改变工作目录等操作,简化了 FTP 应用的开发流程。 3. **邮件服务**...
描述中的 "之前上传的文件是zip的,这次再压缩一次上次,版本没变,1.31" 告诉我们这个压缩包是对之前 ZIP 文件的重新打包,但软件的版本号仍然是 1.3.1,意味着内容没有实质性的更新,可能仅仅是为了改善包的存储或...
该系统设计全面,包含了数据库文件、JSP源代码、演示视频以及详细的系统设计文档,为学习者提供了丰富的实践材料。 首先,我们来看看JSP(JavaServer Pages)技术。JSP是一种动态网页开发技术,它将HTML代码与Java...
10. **性能优化**:Netty的设计目标就是高性能,文档中可能会提供一些最佳实践和优化技巧,以最大化系统的吞吐量和响应速度。 通过阅读和理解这个API接口文档,开发者能够有效地利用Netty-SocketIO构建实时、高并发...
4. **文件上传**:PHP提供了文件上传功能,如`$_FILES`全局数组,用于处理用户上传的文件。程序可能利用PHP的`move_uploaded_file()`函数将文件移动到指定目录,并通过`cfg.php`配置文件设定上传限制。 5. **加密...