淡泊明志,宁静致远

转发:同事写的HTTP上传文件

有关Java中使用FTP上传文件,之前我有发过邮件
现在说一下“HTTP文件上传”,也就是在网页中向WWW服务器上传文件
 
要实现HTTP文件上传,我们必须先了解上传文件的HTTP请求。
我做了个简单的程序示范了把HTTP请求的原始数据写入文件以及如何上传文件。
用文本编辑器查看该文件即可了解请求的格式
在此基础上我们就可以提取出上传文件的名字、文件内容以及原本混合在一起的其他信息。
 
up.jsp页面提供一个表单,可以从这里输入一般数据和选择文件并把文件上传到服务器。
up.jsp程序可以放在OC4J下的任意项目下运行
 
注意,<form>标记有一个enctype属性,属性值是"MULTIPART/FORM-DATA"。
"MULTIPART/FORM-DATA"是多段数据提交格式,就是说提交的数据不单是字符文本数据
还包括其他比如文件的数据,当提交文件数据时必须要指定这个属性
但用了这个属性之后我们将不能用普通的request.getParameter()来取表单数据
必须要用另外的方式来解析"MULTIPART/FORM-DATA"型的数据
 
页面还有个type为file的Input是用来选择上传文件的。
 
up.jsp中的doUpload()方法把request对象的表单原始数据写入D:\test.txt文件.
doUpload()方法如下
<%!
public void doUpload(HttpServletRequest request) throws IOException
{
 PrintWriter pw = new PrintWriter( new BufferedWriter(new FileWriter("D:\\test.txt")));
 ServletInputStream in = request.getInputStream();
 
 int i = in.read();
 while (i != -1)
 {
  pw.print((char) i);
  i = in.read();
 }
 pw.close();
}
%>
选择上传一个文本或者其他文件。点击“提交”按钮之后,表单就提交了,一起提交的还有上传的文件。
提交之后会生成一个D:\test.txt文件。
打开test.txt文件,我们可以看到上传文件的内容和一些上传的信息了。
 
test.txt文件示例:
-----------------------------7d63e71a403a6
Content-Disposition: form-data; name="company"
 
XX
-----------------------------7d63e71a403a6
Content-Disposition: form-data; name="filename"; filename="D:\Temp\TestFile.txt"
Content-Type: text/plain
 
http://211.155.27.112/bbs/showthread.php?s=&threadid=67680
http://www.newhua.com/cfan/200415/usbsetup.rar
liuhui814@tom.com
http://www.zarvadigital.com/eiss/index.jsp
 ?????????ì!~????±????ü??.
??????????????????????~!!!!
-----------------------------7d63e71a403a6--
 
test.txt文件中出现乱码是没有处理中文的缘故
 
从test.txt文件中我们可以看出
提交的数据以“-----------------------------7d63e71a403a6”形式来分隔
下面列出关于数据的格式和name,等等的一些属性
数据的Content-Type属性没有的话表示普通的字符串数据,如"company"=XX
数据的Content-Type属性为text/plain则表示格式为文本文件格式,其filename属性是文件的文件名
当然如果上传的是图片的话,Content-Type属性就是image/gif或者image/jpg
 
从以上我们可以看出,通过解析test.txt(也就是request流数据)中的数据,就可以提取出我们所需要的数据
把提取出来的数据保存到相应文件,我们就可以实现HTTP的文件上传
 
事实上现在有很多第三方的uploadfile组件,都是利用这个原理来实现HTTP文件上传
相信了解了HTTP文件上传的原理,大家会在理解文件上传方面有一定的帮助
在以后要用到HTTP文件上传功能的地方,就算用的是第三方的类库
也能够做到知其然,知其所以然``


PS:请将form的METHOD改用post传送,用request如果文件太大,会丢失内容.

posted on 2006-03-14 09:29 淡泊明志,宁静致远 阅读(6231) 评论(4)  编辑  收藏

评论

# re: 转发:同事写的HTTP上传文件 2006-03-14 17:17 temp

新能科技的兄弟??  回复  更多评论   

# re: 转发:同事写的HTTP上传文件 2006-03-14 17:44 淡泊明志,宁静致远

@temp
也算是吧,不过在大陆不叫新能,你是新能的??  回复  更多评论   

# re: 转发:同事写的HTTP上传文件 2012-01-18 11:18 fantasy

用request如果文件太大,会丢失内容?不用request用什么?  回复  更多评论   

# 上传中国梦我的梦 2013-09-21 19:39 万言论语

今天,我是中国人啦!我有着黄皮肤黑色眼睛,青春很短暂,但是我在这个大家庭里我有着一个梦那就是希望全球都变得干干净净,人们不在乱扔垃圾小河变得清澈见底,水中的鱼儿游来游去,空气中的花香人心脾..…. 为了实现这个梦想 我变从身边做起,每当身边,有垃圾时,我会主动弯腰捡起它不仅在学校这样,而且在公共产和也一样。我相信,只要全球l3亿人都主动弯腰捡起垃,地球就全会变得更加得美丽……我爱自己得祖国,因为他美丽富饶,更因为我有一颗中国心!这就是我的梦!  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: