//上传文件的javabean
package com.sh.jsp; 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 Upload {
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); //读第一行,应该读到分隔符,即一连串的"-----"和一个随机数字
//以及最后一个换行符
if (i < 3) return;
int boundaryLength = i - 2; //-1是为了丢弃换行字符,再-1是因为这是个基于0的数组
String boundary = new String(line, 0, boundaryLength); //-2丢弃换行字符 fields = new Hashtable(); //哈希表,用来存储各字段的值while (i != -1) //开始解析
{
String newLine = new String(line, 0, i); // i 的值在上面第一次readline时返回,等于分界符的长度
if (newLine.startsWith("Content-Disposition: form-data; name=\""))
{
if (newLine.indexOf("filename=\"") != -1) //读到文件名域
{
setFilename(new String(line, 0, i-2)); //调用setFilename方法,自动解析所含文件名
if (filename==null) return;
//文件内容
i = in.readLine(line, 0, 128); //紧接在后面的是ContentType属性
setContentType(new String(line, 0, i-2)); //调用相应方法,自动解析ContentType属性值
i = in.readLine(line, 0, 128); //空行
i = in.readLine(line, 0, 128); //从此行开始为文件数据,i返回该行的字符个数
newLine = new String(line, 0, i);
PrintWriter pw = new PrintWriter(new
BufferedWriter(new FileWriter((savePath==null? "" : savePath) + filename)));
//构造文件输出流,其中filewriter是最基本的
//文件输出流,bufferedwriter是缓冲直接磁盘
//操作的中间流,而printwriter主要用来写字符
//流,其特效方法是把要输出的字符流自动转换成
//字节流
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)))
//boundaryLength的值是正常的分隔符(即带换行符)长度-2
//所以通过检查该值是+2或是+4,即可检查出是文件域结束或是整个请求域结束两种情况.
//考虑到这些,仅仅是为了避免多写入一个换行符
pw.print(newLine.substring(0, newLine.length()-2)); //同样的道理,减掉换行符和
//基于0的下标带来的多1
else pw.print(newLine);
newLine = new String(line, 0, i);
}
pw.close();
}
else //newLine.indexOf("filename=\"") != -1
{
// 普通表单输入元素
// 获取输入元素名字
int pos = newLine.indexOf("name=\"");
String fieldName = newLine.substring(pos+6, newLine.length()-3); //减掉换行符
//和 0下标
//和 引号
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());
} //else newLine.indexOf("filename=\"") != -1
}
i = in.readLine(line, 0, 128);
}
}
}
兄弟,拿回去重新“javac”一下,应该就可以用了。
里面的注释已经多得有点过份了,应该能看懂吧?
package com.sh.jsp; 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 Upload {
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); //读第一行,应该读到分隔符,即一连串的"-----"和一个随机数字
//以及最后一个换行符
if (i < 3) return;
int boundaryLength = i - 2; //-1是为了丢弃换行字符,再-1是因为这是个基于0的数组
String boundary = new String(line, 0, boundaryLength); //-2丢弃换行字符 fields = new Hashtable(); //哈希表,用来存储各字段的值while (i != -1) //开始解析
{
String newLine = new String(line, 0, i); // i 的值在上面第一次readline时返回,等于分界符的长度
if (newLine.startsWith("Content-Disposition: form-data; name=\""))
{
if (newLine.indexOf("filename=\"") != -1) //读到文件名域
{
setFilename(new String(line, 0, i-2)); //调用setFilename方法,自动解析所含文件名
if (filename==null) return;
//文件内容
i = in.readLine(line, 0, 128); //紧接在后面的是ContentType属性
setContentType(new String(line, 0, i-2)); //调用相应方法,自动解析ContentType属性值
i = in.readLine(line, 0, 128); //空行
i = in.readLine(line, 0, 128); //从此行开始为文件数据,i返回该行的字符个数
newLine = new String(line, 0, i);
PrintWriter pw = new PrintWriter(new
BufferedWriter(new FileWriter((savePath==null? "" : savePath) + filename)));
//构造文件输出流,其中filewriter是最基本的
//文件输出流,bufferedwriter是缓冲直接磁盘
//操作的中间流,而printwriter主要用来写字符
//流,其特效方法是把要输出的字符流自动转换成
//字节流
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)))
//boundaryLength的值是正常的分隔符(即带换行符)长度-2
//所以通过检查该值是+2或是+4,即可检查出是文件域结束或是整个请求域结束两种情况.
//考虑到这些,仅仅是为了避免多写入一个换行符
pw.print(newLine.substring(0, newLine.length()-2)); //同样的道理,减掉换行符和
//基于0的下标带来的多1
else pw.print(newLine);
newLine = new String(line, 0, i);
}
pw.close();
}
else //newLine.indexOf("filename=\"") != -1
{
// 普通表单输入元素
// 获取输入元素名字
int pos = newLine.indexOf("name=\"");
String fieldName = newLine.substring(pos+6, newLine.length()-3); //减掉换行符
//和 0下标
//和 引号
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());
} //else newLine.indexOf("filename=\"") != -1
}
i = in.readLine(line, 0, 128);
}
}
}
兄弟,拿回去重新“javac”一下,应该就可以用了。
里面的注释已经多得有点过份了,应该能看懂吧?
解决方案 »
- tomcat不支持js导出excel表格
- 多语言问题
- 怎么通过用list实现数据库中的数据显示到下拉列表中
- 菜鸟求助问题,急!!谢谢大牛们了~
- 关于字符串的问题,大牛进来(50分哦)
- 一道 x+=x-=x---x的问题
- 想学习java方面关于富客户端技术,从哪方面下手?请高手指教~
- Jsoup解析页面 403 ERROR
- 关于 apache Tomcat 4.0 中 web.xml文件放置位置的简单问题
- Tomcat如何正确配置啊? 除了Tomcat 还有其它的JSP引擎吗?
- 如何对一个字符串进行MD5加密(总题解决马上结账)?
- 用weblogic6.0 。 javabean 被编译后该放在哪个目录下?
我要的是用javazoom插入数据库的.