使用servlet新特性,Part對象實現文件上傳,文件下載,簡單

文件上傳:

upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上傳</title>
</head>
<body>

    <!--請求的方式必須是post,必須包含enctype屬性,值選擇multipart/form-data-->
    <form action="uploadServlet"  method="post"  enctype="multipart/form-data">
        <input type="file" id="fileName" name="fileName">
        <input type="submit" value="上傳文件" id="uploadButton">
    </form>

</body>
</html>

出來上傳請求的servlet

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.UUID;

/**
 * @version 1.0
 * @author: liujiahuai
 * @date: 2019/8/22 0022 17:08
 */
@WebServlet(name = "UploadServlet",value = "/uploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter writer = response.getWriter();
        // 創建part對象
        Part part = request.getPart("fileName");
        String contentDisposition = part.getHeader("Content-Disposition");

        // 動態獲取服務器upload文件夾的路徑
        String serverPath = request.getServletContext().getRealPath("download");

        if (part.getContentType().contains("image")){
            String suffix = contentDisposition.substring(contentDisposition.lastIndexOf("=")+2,contentDisposition.length()-1);
            // 隨機的生成一個32的字符串
            String fileName = UUID.randomUUID()+suffix;
            // 向指定的文件夾寫入文件
            part.write(serverPath+"\\"+fileName);
            writer.print("上傳文件成功!!");
            writer.print("<a href='index.jsp'>返回</a>");
        }else {
            writer.print("請選擇正確的圖片格式!!!");
        }
        writer.flush();
        writer.close();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

 

文件下載:

download.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>servlet方式下載</title>
</head>
<body>

    <h1>通過servlet程序下載文件</h1>
    <a href="downLoadServlet?fileName=學生列表-20190601095335.zip">壓縮包</a>
    <a href="downLoadServlet?fileName=2eb75300-6cd5-4694-b7ec-4c927fed161agoBtn.png">圖片</a>

</body>
</html>

出來下載請求的servlet:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * @version 1.0
 * @author: liujiahuai
 * @date: 2019/8/26 0026 10:56
 */
@WebServlet(name = "DownLoadServlet",value = "/downLoadServlet")
public class DownLoadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 獲得請求文件名
        String fileName = request.getParameter("fileName");

        // 設置文件MIME類型
        String mimeType = getServletContext().getMimeType(fileName);
        response.setContentType(mimeType);

        // 設置Content-Disposition
        response.setHeader("Content-Disposition", "attachment;filename="+fileName);

        // 讀取目標文件,通過response將目標文件寫到客戶端
        // 獲取目標文件的絕對路徑
        String fullFileName = getServletContext().getRealPath("/download/" + fileName);
        // 創建輸入輸出流對象
        InputStream in = new FileInputStream(fullFileName);
        OutputStream out = response.getOutputStream();

        // 讀寫文件
        int b;
        while((b=in.read())!= -1) {
            out.write(b);
        }

        out.close();
        in.close();
    }
}

注:上傳需使用@MultipartConfig註解;相關的download、upload文件夾需先創建。

 

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