Javaを使用してブラウザのファイルダウンロード機能を実装する方法

1. ServletContext オブジェクトを理解する

Web アプリケーション全体を表し、プログラムのコンテナ (サーバー) と通信できます。

1.コンセプト

        ServletContext はサーブレットの最大のインターフェイスであり、Web アプリケーションのサーブレット ビューを表示します。サーバーはプロジェクトごとにオブジェクト、つまり ServletContext オブジェクトを作成します。このオブジェクトはグローバルに一意であり、プロジェクト内のすべてのサーブレットによって共有されます。したがって、これはグローバル アプリケーション共有オブジェクトと呼ばれます。

2.入手

1.リクエストオブジェクトを通じて取得

request.getServletContext();

2. HttpServlet 経由で取得する

this.getServletContext();

3. テスト

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "servletContextDemo1", value = "/servletContextDemo1")
public class servletContextDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context1 = request.getServletContext();
        ServletContext context2 = this.getServletContext();               //httpServlet下的servletContext
        System.out.println(context1);
        System.out.println(context2);
    }

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

 3. 機能

1. MIME タイプを取得します。

  • MIME タイプ:インターネット通信中に定義されるファイルのデータ型
  • 形式:大文字/小文字テキスト/html画像/jpeg
  • 取得: String getMimeType(文字列ファイル)
@WebServlet(name = "servletContextDemo2", value = "/servletContextDemo2")
public class servletContextDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = this.getServletContext();               //httpServlet下的servletContext
        String filename = "a.jpg";
        String mimeType = context.getMimeType(filename);               //获取mime类型
        System.out.println(mimeType);                //mime类型为  image/jpeg
    }

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

2. ドメインオブジェクト: 共有データ

  • データフィールドを設定: setAttribute(文字列名,オブジェクト値)
@WebServlet(name = "servletContextDemo3", value = "/servletContextDemo3")
public class servletContextDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = this.getServletContext();               //httpServlet下的servletContext
        context.setAttribute("msg","ohmyga");            //设置共享数据,给整个服务器共享
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }
}
  • データフィールドを取得します: getAttribute(String name)
@WebServlet(name = "servletContextDemo4", value = "/servletContextDemo4")
public class servletContextDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = this.getServletContext();               //httpServlet下的servletContext
        Object msg = context.getAttribute("msg");//设置共享数据
        System.out.println(msg);
    }

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

 2. ファイルの実際のパスを取得する方法

文字列 getRealPath(文字列パス);

1. Web ディレクトリ下のリソースにアクセスします

String a = context.getRealPath("/a.txt");
System.out.println(a);

2. WEB-INFディレクトリ下のリソースアクセス

String b = context.getRealPath("/WEB-INF/b.txt");
System.out.println(b);

3. srcディレクトリ下のリソースアクセス

String c = context.getRealPath("/WEB-INF/classes/c.txt");
System.out.println(c);
@WebServlet(name = "servletContextDemo5", value = "/servletContextDemo5")
public class 获取文件真实路径 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = this.getServletContext();               //httpServlet下的servletContext
        String a = context.getRealPath("/WEB-INF/classes/a.txt");           //src目录下的a.txt
        System.out.println(a);
    }

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

 3. ファイルダウンロードを実装する

1.htmlファイル

        1. この 1.jpg ファイルをダウンロードするなど、簡単な HTML コードを作成します。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>下载</title>
</head>
<body>
<a href="/Web/servletContextDemo6?filename=1.jpg">图片下载</a>
</body>
</html>

         2. プレビュー効果

 2. Webサーバーコード

ここで、応答ヘッダーの MIME タイプ応答ヘッダーの開始メソッドを設定する必要があることに注意してください

response.setHeader(文字列名, 文字列値);

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.FileInputStream;
import java.io.IOException;

@WebServlet(name = "servletContextDemo6", value = "/servletContextDemo6")
public class 文件下载 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String filename = request.getParameter("filename");           //获取请求参数

        //使用字节输入流加载文件进内存
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/WEB-INF/classes/servletContext/" + filename);  //找到文件的服务器路径
        FileInputStream fis = new FileInputStream(realPath);                    //使用字节输入流读取文件

        //设置response响应头
        String mimeType = servletContext.getMimeType(filename);                   //获取mime类型
        response.setHeader("content-type",mimeType);                              //设置响应头类型
        response.setHeader("content-disposition","attachment;filename=" + filename);    //设置响应头打开方式

        //将输入流的事件写出到输出事件
        ServletOutputStream sos = response.getOutputStream();
        byte[] buffer = new byte[1024 * 8];
        int length = 0;
        while((length = fis.read(buffer)) != -1){
            sos.write(buffer,0,length);
        }
        sos.close();
    }

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

 3. プレビュー効果

クリックしてダウンロード

 ファイルはデフォルトでこの場所にダウンロードされます (ブラウザを使用して他の場所に設定することもできます)。

 

おすすめ

転載: blog.csdn.net/weixin_51418964/article/details/123448950