Java_文件上传与下载(一)

来源:互联网 发布:away3d教程 源码 编辑:程序博客网 时间:2024/05/21 22:35

Servlet+IO实现


1.上传

(1)原理:

(2)实现:

注:省去了Servlet配置及前端JSP等

    /*     * 获取上传文件的流信息,保存至一个临时文件中     * 这样临时文件中就包含了上传文件的信息     * 需要做的就是从临时文件中取出上传文件的内容与名称     * 然后按取出的名称保存文件内容     */    //获取请求的输入流    InputStream is = req.getInputStream();      //定义一个临时文件,用于保存上传文件的流信息    File tempFile = new File("C:/Users/Sophon/Desktop/tempFile");       //读写文件    FileOutputStream fos = new FileOutputStream(tempFile);    byte b[] = new byte[1024];    int n;    while((n=is.read(b))!=-1){        fos.write(b,0,n);    }    //关闭输入输出流    fos.close();    is.close();    System.out.println("已保存至临时文件!");    /*     * 从临时文件中获取上传的文件名称     * 文件名在tempFile的第二行末尾     * 最后一个双引号之中的就是     */    RandomAccessFile raf = new RandomAccessFile(tempFile,"r");    raf.readLine();    String str = raf.readLine();    //取到最后一个引号的索引    int endIndex=str.lastIndexOf("\"");    //取到倒数第二个引号的索引并+1    String subStr = str.substring(0,endIndex-1);    int beginIndex=subStr.lastIndexOf("\"")+1;    //取到文件名    String fileName = str.substring(beginIndex,endIndex);       System.out.println("上传文件的名称是:"+fileName);    /*     * 获取上传文件内容的起始位置     *  在第四行换行结束之后     */    //定位到tempFile文件的开始    raf.seek(0);    long startPosition=0;    int i=1;    //连续读取4行,将起始位置指向第四行的换行处    while((n = raf.readByte())!=-1 && i<=4){        if(n=='\n'){            startPosition = raf.getFilePointer();            i++;        }    }    /*     * 获取上传文件内容的结束位置     * 在临时文件倒数第二行的换行处     */    //定位tempFile文件的结尾处,从后往前找,找倒数第二个换行符    raf.seek(raf.length());    long endPosition = raf.getFilePointer();    int j=1;    while(endPosition>=0 && j<=2){        //从倒数第一个字节往回读,指针往回指即可        endPosition--;        raf.seek(endPosition);        if(raf.readByte()=='\n'){            j++;        }    }    /*     * 保存上传文件内容为最终文件     */    //创建保存文件    String filePath = req.getServletContext().getRealPath("/")+"images";    File file = new File(filePath);    if(!file.exists()){        file.mkdir();    }    File saveFile = new File(filePath,fileName);    RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw");    //将上传文件内容写入保存文件中    randomAccessFile.seek(0);    raf.seek(startPosition);    long startTime = System.currentTimeMillis();    while(startPosition<endPosition){        randomAccessFile.write(raf.readByte());        startPosition=raf.getFilePointer();    }    long endTime = System.currentTimeMillis();    System.out.println("上传完成,耗时:"+(endTime-startTime)+"ms!");    //关闭输入输出流,删除临时文件    randomAccessFile.close();    raf.close();    tempFile.delete();    //反馈通知    req.setAttribute("result","上传成功!");    req.getRequestDispatcher("/jsps/upload01.jsp").forward(req,resp);

2.下载

(1)原理:

(2)实现:

注:省去了Servlet配置及前端JSP等

    //设置文件下载路径    String filePath = getServletContext().getRealPath("/")+"images/";    String fileName = req.getParameter("filename");    File file = new File(filePath+fileName);    if(file.exists()){        //设置头信息        //设置Content-Type头字段为application/octet-stream或者application/x-msdownload        //设置Content-Disposition头为attachment;filename=FILENAME        resp.setContentType("application/x-msdownload");        String attachmentSetting = "attachment;filename="+fileName;        resp.setHeader("Content-Disposition", attachmentSetting);        InputStream is = new FileInputStream(file);        ServletOutputStream os = resp.getOutputStream();        //写入文件        byte b[] = new byte[1024];        int n;        while((n=is.read(b))!=-1){            os.write(b,0,n);        }        //关闭流        os.close();        is.close();    }else{        req.setAttribute("downloadError","文件不存在,下载失败!");        RequestDispatcher dispatcher = req.getRequestDispatcher("/jsps/upload01.jsp");        dispatcher.forward(req, resp);    }
0 0
原创粉丝点击