jsp实现文件上传下载的程序示例
一、文件上传
上传文件是web开发中经常要用到的功能:例如在基于b/s的人事信息管理系统中上传照片,在新闻发布系统中上传图片等等。。。。。要实现文件上传功能,就需要综合利用java中的文件输入和输出相关的类。
在tcp/ip中,最早出现的文件上传机制是ftp。它是将文件由客服端发送到服务器的标准机制,能够考虑到跨平台的文本和二进制格式文件。但是在jsp编程中不能使用ftp方法来上传文件,这是由jsp 运行机制所决定的。
下面是上传文件的jsp页面:
<form action="file?file=upload" method="post" enctype="multipart/form-data">
请选择你要上传的文件:<input type="file" name="upload" siez="16"><br>
<input type="submit" value="提交">
</form>
对于文件上传表单处理其中method必须为post,也要增加类型enctype="multipart/form-data"。这样就可以把文件中的数据作为流式数据上传。当然无论是什么文件格式,均可以。。。
下面是servlet 处理程序:
//接收上传文件内容中临时文件的文件名
string tempfilename = new string("tempfilename");
//tempfile 对象指向临时文件
file tempfile = new file("d:/"+tempfilename);
//outputfile 文件输出流指向这个临时文件
fileoutputstream outputstream = new fileoutputstream(tempfile);
//得到客服端提交的所有数据
inputstream filesourcel = request.getinputstream();
//将得到的客服端数据写入临时文件
byte b[] = new byte[1000];
int n ;
while ((n=filesourcel.read(b))!=-1){
outputstream.write(b,0,n);
}
//关闭输出流和输入流
outputstream.close();
filesourcel.close();
//randomfile对象指向临时文件
randomaccessfile randomfile = new randomaccessfile(tempfile,"r");
//读取临时文件的第一行数据
randomfile.readline();
//读取临时文件的第二行数据,这行数据中包含了文件的路径和文件名
string filepath = randomfile.readline();
//得到文件名
int position = filepath.lastindexof('\\');
codetostring codetostring = new codetostring();
string filename = codetostring.codestring(filepath.substring(position,filepath.length()-1));
//重新定位读取文件指针到文件头
randomfile.seek(0);
//得到第四行回车符的位置,这是上传文件数据的开始位置
long forthenterposition = 0;
int forth = 1;
while((n=randomfile.readbyte())!=-1&&(forth<=4)){
if(n=='\n'){
forthenterposition = randomfile.getfilepointer();
forth++;
}
}
//生成上传文件的目录
file fileupload = new file("d:/work space/jsp workspace/jsp_servlet_upandload/file","upload");
fileupload.mkdir();
//savefile 对象指向要保存的文件
file savefile = new file("d:/work space/jsp workspace/jsp_servlet_upandload/file/upload",filename);
randomaccessfile randomaccessfile = new randomaccessfile(savefile,"rw");
//找到上传文件数据的结束位置,即倒数第四行
randomfile.seek(randomfile.length());
long endposition = randomfile.getfilepointer();
int j = 1;
while((endposition>=0)&&(j<=4)){
endposition--;
randomfile.seek(endposition);
if(randomfile.readbyte()=='\n'){
j++;
}
}
//从上传文件数据的开始位置到结束位置,把数据写入到要保存的文件中
randomfile.seek(forthenterposition);
long startpoint = randomfile.getfilepointer();
while(startpoint<endposition){
randomaccessfile.write(randomfile.readbyte());
startpoint = randomfile.getfilepointer();
}
//关闭文件输入、输出
randomaccessfile.close();
randomfile.close();
tempfile.delete();
其中codetostring()方法是一个中文字符处理的方法。如果文件不进行编码转换,则上传后的文件名将会是乱码,接收的文件数据也会是乱码:
下面是codetostring()源代码:
//处理中文字符串的函数
public string codestring(string str){
string s = str;
try {
byte[] temp = s.getbytes("utf-8");
s = new string(temp);
return s ;
} catch (unsupportedencodingexception e) {
e.printstacktrace();
return s;
}
}
二:文件下载
实现文件下载的最简单的方法就是使用超链接。假设在服务器上web目录下地upload子目录存在user.doc这个文档。如:
<a href="http://localhost:8080/upload/user.doc">下载user.doc</a>
当单击这个超级链接时,将会在浏览器中直接打开这个文档,就像是把word软件嵌入在浏览器中一样。
打开文档后就可以实现另存为了。当然在web上,最常见的方式是单击链接后,出现“另存为”对话框:
//获取要下载的文件名
string filename = request.getparameter("name");
//得到想客服端输出的输出流
outputstream outputstream = response.getoutputstream();
//输出文件用的字节数组,每次向输出流发送600个字节
byte b[] = new byte[600];
//要下载的文件
file fileload = new file("d:/work space/jsp workspace/jsp_servlet_upandload/file/upload",filename);
//客服端使用保存文件的对话框
response.setheader("content-disposition", "attachment;filename="+filename);
//通知客服文件的mime类型
response.setcontenttype("application/msword");
//通知客服文件的长度
long filelength = fileload.length();
string length = string.valueof(filelength);
response.setheader("content_length", length);
//读取文件,并发送给客服端下载
fileinputstream inputstream = new fileinputstream(fileload);
int n = 0;
while((n=inputstream.read(b))!=-1){
outputstream.write(b,0,n);
}
在该程序中,response对象的setcontenttype()用来定义服务器发送给客服端内容的mime类型。这里对mime就不特别介绍了。事实上,凡是浏览器能处理的所有资源都有对应的mime资源类型。在与服务器的交互中,浏览器就是对html、jsp等文件浏览器直接将其打开。对于word、excel等浏览器自身不能打开的文件则调用相应的方法。对于没有标记mime类型的文件。浏览器则根据其扩展名和文件内容猜测其类型。。。
上一篇: PhotoShop(PS)自制炫酷旋转QQ头像实例教程
下一篇: ae复制快捷键(ae快捷键常用表)