- 浏览: 1564433 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 2964NodeJs获取参数: proces ... -
jprofiler追踪问题
2011-08-12 18:20 1027Jprofiler下载页: http://www.ej ... -
Linux服务器性能评估与优化【z】
2011-07-01 10:05 1523来自:http://www.itlearner.com/ ... -
Java 理论与实践: 非阻塞算法简介【z】
2011-03-26 20:39 1256From: http://www.ibm.com/develo ... -
Java Crash问题分析[z]
2011-03-23 14:41 5948参考: 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 3152From:http://hi.baidu.com/jabber ... -
nginx负载均衡和lvs负载均衡的比较分析【z】
2009-10-13 20:02 1447From:http://www.shouker.com/u ...
相关推荐
分布式服务架构:原理、设计与实战 高清PDF,因上传文件大小限制,分割成了三个文件,全部下载放在同一目录下,即可成功解压,总共三部分:分布式服务架构:原理、设计与实战.zip 分布式服务架构:原理、设计与实战....
【前端页面文件拖拽上传模块js代码示例】是一个实用的前端...总的来说,这个示例涵盖了前端开发中的多个重要概念,包括拖放交互、文件API、AJAX上传、DOM操作和UI设计,是学习和实践前端文件上传技术的一个良好起点。
4. **文件上传**:PHP提供了文件上传功能,如`$_FILES`全局数组,用于处理用户上传的文件。程序可能利用PHP的`move_uploaded_file()`函数将文件移动到指定目录,并通过`cfg.php`配置文件设定上传限制。 5. **加密...
1. **文件上传**:首先,你需要将压缩包中的所有文件上传到你的论坛根目录。这意味着你需要确保你有对论坛服务器的文件管理系统访问权限,并且知道如何在FTP客户端或者通过服务器控制面板将文件从本地计算机移动到...
由于文件较大,为了符合CSDN的上传限制,已被拆分为三个部分发布,这是其中的第二部分。因此,读者在学习过程中需要结合其他两部分来获取完整的解题思路和答案。 数字信号处理的基础知识包括: 1. **信号与系统**...
在C# 1.7z这个压缩文件中,我们可能会看到以下知识点: 1. **C#基本语法**:包括变量声明、数据类型(如int、string、bool等)、运算符、控制流程(if-else、switch、for、while循环)和函数的使用。 2. **类与...
PUDN是一个知名的资源共享平台,通常会为上传的文件提供介绍、使用方法或其他相关信息。这个文本文件可能包含了关于这个压缩包的来源、版权信息或下载注意事项。 3. **Java画图程序**:这可能是一个使用Java语言...
8. **云存储服务**:了解并使用云存储平台,如Google Drive或OneDrive,进行文件上传、下载、共享及同步。 9. **网络安全**:学习如何识别和避免网络钓鱼、恶意软件,并设置强密码,保持系统和软件的最新更新以增强...
不多说废话,看题目,本教程适合练手,会python+android基础的人群,文件较大,上传乃是下载链接,下面上目录: 1-1 课程导学 2-1 如何学好Android App性能测试? 2-10 详解【电量】监控值的获取方法 \' D, l" p) ...
书中的源码文件`Android_Wireless_Appliction_Development_codes.7z`可能包含了书中实例项目的源代码,读者可以通过这些代码加深对理论知识的理解,并进行实践操作。而`Android_Wireless_Application_Development_...
12. **文件上传与下载**: Spring MVC提供了处理文件上传和下载的功能,通过`MultipartFile`接口可以方便地处理文件流。 13. **源码分析**: 搭配源码阅读,可以帮助开发者更深入地理解Spring MVC的工作原理,...
2012-06-13 12:53 169,265 12.FTP上传下载文件演示.rar 2012-06-13 13:46 194,132 200个小游戏原源代码Code.zip 2012-06-13 12:54 257,602 《html深入浅出》源代码.rar 2012-06-13 12:47 306,755 Graphics32 Canny ...