Java Web之下載文件


 

  下載的文件,不能隨便的被訪問,放在外面的文件夾肯定不行,url一敲就能訪問了,所以我們要放在WEB-INF文件夾里面,WEB-INF文件夾只有Servlet才能訪問,我們新建一個文件夾,叫download里面我放了三個文件,一個zip,一個exe,一個png,如圖:

 

  我新建了一個JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>下載文件</title>
</head>
<body>
<h3>下載文件</h3>
<a href="/download?filename=ColorPix_CHS.zip">ColorPix_CHS.zip</a><br>
<a href="/download?filename=QQ9.0.4.exe">QQ9.0.4.exe</a><br>
<a href="/download?filename=小女孩.png">小女孩.png</a><br>

</body>
</html>

  一個Servlet

package com.vae.download;

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.IOException;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1.檢查權限,檢查積分或者什么什么幣,這個不講

        //2.獲取下載的資源文件的名稱,並且進行轉碼,轉碼是為了讓你的中文文件顯示的時候不亂碼,但是我不轉碼也沒亂碼
        String filename = req.getParameter("filename");
        filename=new String(filename.getBytes("ISO-8859-1"),"UTF-8");
        //3.從服務器中獲取想下載的文件的絕對路徑
        String realPath=super.getServletContext().getRealPath("/WEB-INF/download/"+filename);
        //4.告訴瀏覽器不要打開文件,直接下載,原因是IE6會直接打開文件,所以這個算是特意為IE6設置的
        resp.setContentType("application/x-msdownload");
        //5.設置下載文件的時候,文件名稱應該是文件自己本身的名稱,因為默認的下載名稱的down
        String userAgent=req.getHeader("User-Agent");
        if (userAgent.contains("MSIE")) {
            //如果是IE瀏覽器,是這種編碼格式
            filename=URLEncoder.encode(filename,"UTF-8");
        }else {
            //非IE瀏覽器,是這種編碼格式
            filename=new String(filename.getBytes("UTF-8"),"ISO-8859-1");
        }
        resp.setHeader("Content-Disposition","attachment;filename="+filename);
        //6.下載文件
        Files.copy(Paths.get(realPath),resp.getOutputStream());

    }
}

 

  需要講解的都在注釋里面了

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM