Jsp+Servlet实现文件上传下载

使用Servlet获取上传文件的输入流然后再解析里面的请求参数。

一、 Jsp页面

post方式提交,enctype为”multipart/form-data”。

<body>
  <form action="uploadServlet.do" method="post" enctype="multipart/form-data">
    <input type="file" id="myfile" name="myfile">
    <input type="submit" value="提交">
    <br>
    ${result}
    <br>
    下载:<a href="downloadServlet.do?filename=file.txt">file.txt</a>
    <br>
    ${errorResult}

   </form>
  </body>

二、 创建文件上传Servlet

上传的文件无法直接保存,需创建一个临时文件,获取上传文件输入流信息,将文件输出流指向临时文件。从临时文件获取上传文件名、文件内容开始与结束指针,设置文件上传的路径,临时文件将文件内容输出到保存文件。

package com.yf.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UploadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            this.doPost(request, response);

    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            System.out.println("已接收到请求 ");
            //从request当中获取流信息
            InputStream fileSource = request.getInputStream();
            String tempFileName = "E:/tempFile";
            //tempFile指向临时文件
            File tempFile = new File(tempFileName);
            //outputStream文件输出流指向这个临时文件
            FileOutputStream outputStream = new FileOutputStream(tempFile);
            byte b[] = new byte[1024];
            int n;
            while((n=fileSource.read(b))!=-1){
                outputStream.write(b,0,n);
            }
            //关闭输出流输入流
            outputStream.close();
            fileSource.close();

            //获取上传文件的名称
            RandomAccessFile randomFile = new RandomAccessFile(tempFile, "r");
            randomFile.readLine();//第一行不要
            //获取第二行
            String str = randomFile.readLine();
            int benginIndex = str.lastIndexOf("=")+2;
            int endIndex = str.lastIndexOf("\"");
            String fileName = str.substring(benginIndex,endIndex);
            System.out.println("文件名"+fileName);

            //重新定位文件指针到文件头
            randomFile.seek(0);
            long startPosition = 0;
            int i = 1;
            while((n = randomFile.readByte())!= -1 &&i <= 4){
                if(n == '\n'){
                    //重新获取文件指针
                    startPosition = randomFile.getFilePointer();
                    i++;
                }
            }
            startPosition -=1;
            //获取文件内容结束位置
            //定位指针到文件结尾
            randomFile.seek(randomFile.length());
            long endPosition = randomFile.getFilePointer();
            int j = 1;
            while(endPosition >= 0 && j<=2){
                endPosition--;
                randomFile.seek(endPosition);
                if(randomFile.readByte() == '\n'){
                    j++;
                }
            }
            endPosition -= 1;

            //设置保存文件的路径
            String realPath = getServletContext().getRealPath("/")+"images";
            File fileupload = new File(realPath);
            if(!fileupload.exists()){
                //不存在创建
                fileupload.mkdir();
            }
            File saveFile = new File(realPath,fileName);
            RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile, "rw");
            //从临时文件当中读取文件内容
            randomFile.seek(startPosition);
            while(startPosition < endPosition){
                randomAccessFile.write(randomFile.readByte());
                startPosition = randomFile.getFilePointer();
            }
            //关闭输入输出流,删除临时文件
            randomAccessFile.close();
            randomFile.close();
            tempFile.delete();
            request.setAttribute("result", "上传成功");
            RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
            dispatcher.forward(request, response);
    }


}

三、创建 文件下载Servlet

package com.yf.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadServlet extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        this.doPost(request, response);
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //获取文件下载路径  
        String path = getServletContext().getRealPath("/")+"images/";
        String filename = request.getParameter("filename");
        File file = new File(path+filename);
        if(file.exists()){
            //设置相应类型application/octet-stream
            response.setContentType("application/x-msdownload");
            //设置头信息
            response.setHeader("Content-Disposition", "attachment;filename=\""+filename+"\"");
            //读取文件
            InputStream inputStream = new FileInputStream(file);
            ServletOutputStream outputStream = response.getOutputStream();
            byte b[] = new byte[1024];
            int n;
            while((n = inputStream.read(b))!=-1){
                outputStream.write(b,0,n);
            }
            //关闭流
            outputStream.close();
            inputStream.close();

        }else{
            request.setAttribute("errorResult", "文件不存在下载失败");
            request.getRequestDispatcher("index.jsp").forward(request, response);
        }
    }



}

四、 运行结果

选择上传文件:

这里写图片描述

点击提交
在tomcat下保存文件,页面显示上传成功。

这里写图片描述

点击下载,如果文件存在,则下载。不存在显示下载失败。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值