有关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
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如果文件太大,会丢失内容.