- 浏览: 1576663 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 1144JDK的几种分析工具 http://liudaoru ... -
NodeJs相关资料
2011-08-18 14:55 3010NodeJs获取参数: proces ... -
jprofiler追踪问题
2011-08-12 18:20 1048Jprofiler下载页: http://www.ej ... -
Linux服务器性能评估与优化【z】
2011-07-01 10:05 1551来自:http://www.itlearner.com/ ... -
Java 理论与实践: 非阻塞算法简介【z】
2011-03-26 20:39 1286From: http://www.ibm.com/develo ... -
Java Crash问题分析[z]
2011-03-23 14:41 5973参考: http://www.ibm.com/develop ... -
Berkeley DB相关
2010-09-25 22:17 1055为什么要使用Berkeley DB,它适合什么场合应用?Ber ... -
熟悉系统方法总结
2010-07-06 14:26 819了解一个陌生的系统是我们经常碰到的事情,下面总结一下自己的一些 ... -
Java缓存框架 EhCache
2010-07-06 14:09 4730From: http://www.oschina.net/p/ ... -
【nio】使用 ServerSocketChannel 实现的 File 服务器[z]
2010-05-21 17:31 3974From: http://www.java2000.net/p ... -
Memcached命令行管理
2010-03-15 11:18 4489From: http://www.exp2up.com/2 ... -
(转)Resin服务器配置指南
2010-01-21 15:35 3465From:http://blog.21cn.com/super ... -
Flickr架构
2010-01-11 09:52 1267From: http://www.cyask.com/ques ... -
JDK的几种分析工具
2009-12-04 12:13 10905From: http://blog.csdn.net/hant ... -
XMemcached——一个新的开源Java memcached客户端
2009-10-23 09:27 1896From: http://www.infoq.com/cn/ ... -
多线程任务调度学习
2009-10-16 13:58 2303昨天找到一套多线程任务调度的代码,相当的不错,先把思路总结一下 ... -
用HSCALE实现MySQL的数据分布式存储
2009-10-15 12:47 3019From:http://www.ningoo.net/ht ... -
马化腾:搜索、电子商务硬仗一定要坚持打
2009-10-15 12:09 1718From:http://www.techweb.com.c ... -
MySQL分表实现上百万上千万记录分布存储的批量查询设计模式【z】
2009-10-15 09:56 3172From:http://hi.baidu.com/jabber ... -
nginx负载均衡和lvs负载均衡的比较分析【z】
2009-10-13 20:02 1473From:http://www.shouker.com/u ...
相关推荐
分布式服务架构:原理、设计与实战 高清PDF,因上传文件大小限制,分割成了三个文件,全部下载放在同一目录下,即可成功解压,总共三部分:分布式服务架构:原理、设计与实战.zip 分布式服务架构:原理、设计与实战....
这种软件的主要目的是帮助用户上传、下载或者管理与气象相关的Z文件,Z文件通常包含了气象观测数据,如温度、湿度、风速等关键信息。 在描述中提到,“提供源代码,可供初学者参考”,这意味着这个项目不仅是一个...
标题 "7z格式压缩 VC++源码包.7z" 提到的是一个使用7z压缩格式的文件,其中包含了VC++(Visual C++)的源代码。7z是一种高效的文件压缩格式,由7-Zip软件创建,具有较高的压缩比率和对多种压缩算法的支持。它允许...
它通常包括文件上传、下载、分类、检索、权限控制、版本管理、安全保护等功能,旨在提高企业的信息组织与共享效率,同时保障数据的安全性。在这个“业务文件管理系统.7z”压缩包中,我们可能找到了实现这些功能的源...
5. **应用案例**:展示实际场景下如何使用这些功能,如文件上传、备份系统等。 总的来说,这个项目涵盖了Java文件压缩与解压缩的基本原理和实践,提供了学习和参考的素材,有助于提升开发者在这一领域的技能。通过...
同时,需要熟悉PHP与服务器交互的方式,例如通过`$_FILES`全局变量处理文件上传。 2. **文件系统操作**:PHP提供了丰富的文件系统函数,如`file_exists()`检查文件是否存在,`mkdir()`创建目录,`rename()`重命名...
总之,"爱一网情深文件管理系统"的源码提供了一个深入了解文件管理系统工作原理的机会,并为有经验的开发者提供了定制和优化系统的基础。通过深入研究和实践,可以增强自身的编程技能,同时也能为团队或组织带来更...
5. **文件上传与下载**:系统需要支持大文件上传和断点续传功能,这涉及到文件切片、多线程传输和进度追踪等技术。 6. **权限与安全**:用户权限管理是系统的核心部分,涉及到身份验证(如OAuth、JWT)和授权机制,...
1. **压缩技术**:了解ZIP格式的原理和使用方法,包括如何创建、解压和管理ZIP文件,以及与其他压缩格式(如RAR、7Z)的区别。 2. **HTML基础知识**:HTML的基本元素、属性和结构,如标签、类选择器、ID选择器,...
首先,拖拽上传是HTML5引入的一项新特性,允许用户直接通过鼠标拖动文件到网页指定区域进行上传,极大地提升了文件上传的易用性。在"uploadcaesar_20190724"项目中,我们可以看到利用了这一特性,实现了无需额外配置...
标题中的“django-python.7z”表明这是一个与Python的Django框架相关的压缩包文件,通常包含教程、项目源代码或示例应用。Django是Python编程语言中的一个高级Web开发框架,它支持快速开发和干净、实用的设计。这个...
这个压缩包文件包含了关于MQ-3传感器模块的详细资料,包括原理图、教程、源代码以及其它相关技术文档,为用户提供了全面的学习和开发资源。 首先,MQ-3传感器模块的工作原理基于半导体气敏材料的特性变化。当传感器...
用户需要将这些文件上传到Z-Blog的相应目录,然后在后台设置中选择并应用该模版。 模版的定制可以从以下几个方面着手: 1. **颜色调整**:通过修改style.css中的颜色代码,可以改变模版的主题色,比如将背景色、...
【标题】"示例代码(2).7z"是一个压缩包文件,通常用于存储和传输多个相关文件。在IT行业中,这种格式常被开发者用来共享项目代码或软件库,因为它们可以有效地减小文件大小,便于传输和存储。7-Zip是一种流行的开源...
在【lmc-1.2.16-src-zfg】这个压缩包中,包含了源代码文件,开发者可以通过阅读和学习这些代码来理解整个应用的工作原理,同时也可以作为开发类似功能的起点。源代码分析可以帮助深入理解Qt的网络编程、多线程以及...
【前端页面文件拖拽上传模块js代码示例】是一个实用的前端...总的来说,这个示例涵盖了前端开发中的多个重要概念,包括拖放交互、文件API、AJAX上传、DOM操作和UI设计,是学习和实践前端文件上传技术的一个良好起点。
在实际应用中,网络控件模块可以用于创建Web服务客户端,与服务器进行数据交互,例如获取网页内容、上传下载文件、实现即时通讯等。此外,也可以用于实现局域网内的通信,例如文件共享、设备控制等。 对于初学者来...
《Z-BlogPHP_BAE_1_2:深入解析与应用》 Z-BlogPHP_BAE_1_2 是一个基于 PHP 的博客系统,专为百度应用引擎(BAE)优化设计的版本。这个压缩包提供了完整的源代码,旨在帮助用户快速搭建个人或企业博客,同时为初学...
"新建 好压 RAR 压缩文件.zip_解压缩软件_达瓦"这一标题暗示了我们讨论的核心——好压软件,它是一款流行的压缩与解压缩工具,而RAR是一种常见的压缩文件格式。在本文中,我们将深入探讨解压缩软件的功能、RAR格式的...