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下保存文件,頁面顯示上傳成功。

這裏寫圖片描述

點擊下載,如果文件存在,則下載。不存在顯示下載失敗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章