用 Java Servlet 实现文件上载(老文新发)
以下对各标号作出说明:
三、编程
throws ServletException, java.io.IOException
{
//新建一个对象,其实,若写成static的,连这一步都可省了
DecodeRequestStream decode = new DecodeRequestStream();
//调用Decode方法,返回一个哈希表
Hashtable hashtable = decode.Decode(req, 2);
……
//获取type的值
String type = (String)hashtable.get("type");
//获取id的值
String id = (String)hashtable.get("id");
//以字节数据的方式获得文件的内容
byte[] filecontent = (byte[])hashtable.get("file");
//获得文件名
String filename = (String)hashtable.get("filename");
//获得文件类型
String filetype = (String)hashtable.get("filetype");
……
}
入参:
(1)HttpServletRequest: 从这个参数中可以得到输入流;
(2)int ParamsCount: 这个参数表示输入流中除文件外,普通参数的个数
提供这个参数是从性能的角度出发的,下文中会有说明;
出参:
一个哈希表。如果是普通参数,则以(string name, string value)的方式
保存,如果是文件,则以(string name, byte[] value)的方式保存;
对DecodeRequestStream类,作如下说明:
1、本类一次只能处理一个文件的上载。如果有多个文件,将会保存在一个字
节数组里面。实际上,可以很容易地把本程序改写成支持多文件的;
2、文件必须是作为最后一个参数。此前有多少个参数必须在调用时通过Param
sCount参数指定。细心的大侠会发现这个参数也是为了性能。因为确定边
界boundary的位置是一个很费时的操作,需要先拷贝某个位置起与boundary
相同长度的字节数组,然后再与boundary比较。在确定文件内容的结束位置
时,要从文件流的开始处一直搜索到文件的结束处,对于大的文件,这是
很费时的。所以本程序中做了一点小动作,那就是,对于第ParamsCount+1
的那个参数(也就是文件参数),不用常规方法搜索,而是直接跳到输入流的
末尾(末尾是boundary 0D 0A),再往前倒数boundary的长度外加4个字节。
然后从这个位置开始定位boundary(一找一个准)。程序中,用了5个字节,
是"留有余地"的想法,其实不用。
3、本程序在 Tomcat 3.2.1 + Sun JDK 1.3.0_02 下运行通过,客户端浏览器
为Internet Exploere 5.0、Netscape Communacator 4.77 和 Netscape 6。
Code:
[Ctrl+A Select All]
4
分享
收藏
猜你喜欢
- 【随笔】JVM核心:JVM运行和类加载
- JavaWeb程序架构模式的演进
- Java定时任务调度详解
- JavaEE_Spring_Aspect无法切入Controller层
- Java高级特性——注解,这也许是最简单易懂的文章了
- 局部内部类的成员变量被final修饰才能被局部内部类的方法所访问
- java实现小球碰撞反弹
- 双色球--最多2个号码相同的内幕
发表评论
Ctrl+Enter 发布
发布
取消
11条评论
按时间倒序按时间正序
随风之幻
1楼 2007-01-21 01:12:27
main.html:
<body>
<form action="jsp1.jsp" enctype="MULTIPART/FORM-DATA" method=post>
作者: <input type="text" name="author" />
<br />
公司: <input type="text" name="company" />
<br />
选择要上载的文件 <input type="file" name="filename" />
<br />
<input type="submit" value="上载" />
</form>
</body>
jsp1.jsp:
<jsp:useBean id="thebean" scope="page" class="com.zzl.SimpleBean" />
<%
thebean.doUpload(request);
%>
SimpleBean.java
package com.zzl;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.BufferedWriter;
import java.io.FileWriter;
public class SimpleBean {
public void doUpload(HttpServletRequest req) throws ServletException,IOException {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("D:\\Demo.out")));
ServletInputStream in = req.getInputStream();
int i=in.read();
while(i!=-1) {
pw.print((char)i);
i=in.read();
}
pw.close();
}
}
FileUpload.java:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.ServletInputStream;
import java.util.Dictionary;
import java.util.Hashtable;
import java.io.PrintWriter;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class FileUploadBean {
private String savePath, filepath, filename, contentType;
private Dictionary fields;
public String getFilename() {
return filename;
}
public String getFilepath() {
return filepath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
public String getContentType() {
return contentType;
}
public String getFieldValue(String fieldName) {
if (fields == null || fieldName == null)
return null;
return (String) fields.get(fieldName);
}
private void setFilename(String s) {
if (s==null)
return;
int pos = s.indexOf("filename=\"");
if (pos != -1) {
filepath = s.substring(pos+10, s.length()-1);
// Windows浏览器发送完整的文件路径和名字
// 但Linux/Unix和Mac浏览器只发送文件名字
pos = filepath.lastIndexOf("\\");
if (pos != -1)
filename = filepath.substring(pos + 1);
else
filename = filepath;
}
}
private void setContentType(String s) {
if (s==null)
return;
int pos = s.indexOf(": ");
if (pos != -1)
contentType = s.substring(pos+2, s.length());
}
public void doUpload(HttpServletRequest request) throws IOException {
ServletInputStream in = request.getInputStream();
byte[] line = new byte[128];
int i = in.readLine(line, 0, 128);
//第一行应该是分界符,而且如果没有错误的话,
//它的长度应该大于3。如果它的长度小于3,我们可以认为出现了错误,doUpload方法应该立即返回
if (i < 3)
return;
int boundaryLength=i-2;
String boundary = new String(line, 0, boundaryLength); //-2丢弃换行字符
fields = new Hashtable();
while (i!=-1) {
String newLine = new String(line, 0, i);
if (newLine.startsWith("Content-Disposition: form-data; name=\"")) {
if (newLine.indexOf("filename=\"") != -1) {
setFilename(new String(line, 0, i-2));
if (filename==null)
return;
//文件内容
i = in.readLine(line, 0, 128);
setContentType(new String(line, 0, i-2));
i = in.readLine(line, 0, 128);
//空行
i = in.readLine(line, 0, 128);
newLine = new String(line, 0, i);
PrintWriter pw = new PrintWriter(new BufferedWriter(new
FileWriter((savePath==null? "" : savePath) + filename)));
while (i != -1 && !newLine.startsWith(boundary)) {
// 文件内容的最后一行包含换行字符
// 因此我们必须检查当前行是否是最 // 后一行
i = in.readLine(line, 0, 128);
if ((i==boundaryLength+2 || i==boundaryLength+4)&&(new String(line, 0, i).startsWith(boundary)))
pw.print(newLine.substring(0, newLine.length()-2));
else
pw.print(newLine);
newLine = new String(line, 0, i);
}
pw.close();
}
else {
// 普通表单输入元素
// 获取输入元素名字
int pos = newLine.indexOf("name=\"");
String fieldName = newLine.substring(pos+6, newLine.length()-3);
i = in.readLine(line, 0, 128);
i = in.readLine(line, 0, 128);
newLine = new String(line, 0, i);
StringBuffer fieldValue = new StringBuffer(128);
while (i != -1 && !newLine.startsWith(boundary)) {
// 最后一行包含换行字符
// 因此我们必须检查当前行是否是最后一行
i = in.readLine(line, 0, 128);
if ((i==boundaryLength+2 || i==boundaryLength+4) && (new String(line, 0, i).startsWith(boundary)))
fieldValue.append(newLine.substring(0, newLine.length()-2));
else
fieldValue.append(newLine);
newLine = new String(line, 0, i);
}
fields.put(fieldName, fieldValue.toString());
}
}
i = in.readLine(line, 0, 128);
}
}
}
用 Java Servlet 实现文件上载(老文新发)相关推荐
- 老文新读 | 大数据于国内影视行业的意义及应用
编者注:本文由作者4年前发表于知乎专栏,前两天编者偶然读到,觉得很有意思,于是转过来与大家分享.原文标题:评析:触不到的大数据 作者 | 王义之,凡影合伙人 最近这几年,我们可以听到很多关于大数据在影 ...
- java servlet html文件_Servlet生成html页面
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容. 该Se ...
- Word处理控件Aspose.Words功能演示:在 Java 中将 HTML 文件转换为 Word 文档
在各种情况下,您可能需要将 HTML 内容转换为 Word 文档.例如,用于从所见即所得 HTML 编辑器生成文档或将网页转换为 DOCX 或 DOC 格式.为了以编程方式执行此转换,本文介绍了如何将 ...
- Java Servlet实现文件上传下载操作
1.配置对应的文件,导入相应的包 对应包下载地址:https://wws.lanzous.com/ipFtEoyv1je 2.编写jsp页面 代码如下: <%@ taglib prefix=&q ...
- drop box java_使用Dropbox Java API将文件上载到Dropbox
我想使用Java API for DropBox上传文件.以下代码为我提供了oauth_token和oauth_secret.但是当我尝试上传文件时,我得到一个例外. Java类 package co ...
- 文件上载限制4gb_新get!百度网盘破除上传单个文件超4GB限制
现在网盘的限制是越来越多,国内还在免费+能用的也就剩百度网盘了.虽然随便注册个账号大家都能凑合用用,但非会员5GB的使用空间.上传/下载速率限制,加上下载大文件必须使用网盘客户端等,让小编发现百度网盘 ...
- 老文新看:一口气说透中台--给你架构师的视角
编 辑:彭文华 来 源:大数据架构师(ID:bigdata_arch) 彭友们好,我是你的老彭友.因公众号迁移,老文章都搜索不到了.这是之前的原创文章,现在重新再发一遍,看过的彭友直接略过就行哈~~ ...
- 旧文新发----真情与技巧的交响
真情与技巧的交响 --读二熊诗词有感 杨森翔 今年"五一"前,接到诗词学会寄来的<寒塘韵语>,顺手翻开,便读到五言律绝<飞鸿><秋草>< ...
- 侵略伤痕(旧文新发)
这篇文章是我中学时候几篇作品的集合,最初发表在红袖添香,不知道这些年她经历了什么,今天在自己的博客,再次将这个文章发出来.只为祭奠,那逝去的青春,那些错过的人.那时候的爱情那样简单,爱的遮遮掩掩,被爱 ...
最新文章
- 现代软件工程 作业 团队冲刺阶段的要求
- 格雷编码Python解法
- Spring 环境与profile(一)——超简用例
- 企业网站 源码 服务邮箱:_公司企业邮箱购买,外贸企业邮箱用哪家服务好?
- HDU Integer's Power(容斥原理)
- 反函数连续性定理 反三角_高中数学:三角函数诱导公式及诱导公式口诀
- 爱普生690k打印针测试软件_办公室打印机什么牌子好 办公室打印机怎么选购【详解】...
- php定时器使用,PHP定时器的说明
- 显著性检测(saliency detection)评价指标之KL散度距离Matlab代码实现
- 将SpringBoot项目打包并部署到服务器
- 怎么创建css样式表,为HTML5表单创建CSS样式
- pdf文档统计字数的问题
- 记录archlinux第n次修复引导区
- PDF图片怎么提取?看完这篇你就会了
- EBS中应用,职责,数据组,请求组等关系
- hive面试题总结(2020最新版)
- DDR controller控制器之AXI接口模块设计
- 2.企业发放的奖金根据利润提成。
- 查看锐捷poe交换机供电状态_锐捷 RG-S2910-24GT4SFP-UP-H 24个电口支持PoE和PoE+供电交换机...
- 使用qemu在windows系统下搭建树莓派3b环境运行RT-Thread