欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

jsp实现文件上传下载的程序示例

程序员文章站 2023-11-21 20:06:40
一、文件上传上传文件是web开发中经常要用到的功能:例如在基于b/s的人事信息管理系统中上传照片,在新闻发布系统中上传图片等等。。。。。要实现文件上传功能,就需要综合利用j...

一、文件上传
上传文件是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类型的文件。浏览器则根据其扩展名和文件内容猜测其类型。。。