フロントエンドでのファイルダウンロード機能の実装方法は数多くありますが、ここでは一つずつ紹介することはせず、ここではファイルストリームダウンロードを利用した実装方法のみを紹介します。
これはファイル ストリームであるため、フロントエンドに大量のバイナリ コードを返す必要があります。バックエンドとして、OutPutStream
バックエンドは Java で提供されるサーブレットを使用できますHttpServletResponse
。中心となる手順は、応答のデータ型を設定し、それを特定のファイル タイプまたはバイナリ形式に設定し、応答ヘッダーを設定してから、ファイルをフロントエンドに送信することですServletOutputStream
。流れの形。
コードを直接アップロードする
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=example.xls");
説明する
-
最初に応答データ タイプを設定します。ダウンロードするファイルのタイプを設定します。ファイルのタイプが分からないが、テキスト ファイルではないことは確かな場合は、ブラウザが認識できるように次の表現を使用します。これはバイナリ データであるため
application/octet-stream
、解析されません。 -
次に、応答ヘッダーを設定します。
attachment
: 応答コンテンツが添付ファイルとして扱われ、ブラウザーのダウンロード動作がトリガーされることを示します。
filename
: パラメータは、ダウンロードしたファイルの名前を指定します。上記のコードにより、ブラウザは example.xls ファイルをダウンロードします。
ここに、一般的な MIME タイプと、下の図、png タイプ、pdf、ppt などの一般的な MIME タイプのリストが含まれるリンクがあります。
その後、ストリームの形式でフロントエンドに送信されます。
ServletOutputStream outputStream = response.getOutputStream();
checkInfo.write(outputStream);
outputStream.flush();
このようにして、バックエンドはファイル ストリームの形式でフロントエンドへのファイルの受け渡しを完了し、フロントエンドによって開始されたリクエストによってブラウザのダウンロード動作がトリガーされます。
以下は完全なコードです
@GetMapping("/output/{classId}/{checkName}")
public void checkToExcel(@PathVariable String checkName, @PathVariable String classId, HttpServletResponse response) {
HSSFWorkbook checkInfo = checkExcelService.getCheckInfo(classId, checkName);
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + checkName + "签到统计表.xls");
try {
ServletOutputStream outputStream = response.getOutputStream();
checkInfo.write(outputStream);
outputStream.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
私と同じような友達がいるかわかりませんが、メソッドの戻り値はストリームとして記述されます (例: ByteArrayOutputStream
)。これは間違いです。
以前このプログラムを書いたとき、フロントエンドにストリームを返していたため、ダウンロードされるファイルの形式が常に間違っており、ブラウザが受け取るレスポンスのデータ型が常にjsonになっていたのが原因でした。ストリームの送信には使用されないため、response.getOutputStream()
フロントエンドが実際にバイナリ ファイル ストリームを受信できるように、ストリームを取得してフラッシュするために使用する必要があります。