Java_文件上传与下载(一)

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

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);
    }

你可能感兴趣的:(JAVA,java)