SpringBoot實現文件下載
阿新 • • 發佈:2021-02-18
技術標籤:SpringBoot框架
pom依賴:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</ artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
HTML5 程式碼:
<input type="button" onclick="downTemplate()" value="下載模板" class="btn btn-primary"/>
JavaScript 程式碼:
<script type="text/javascript">
var fileName = "學生資訊模板.xlsx";
function downTemplate() {
window.open("/admin/downTemplate?fileName="+fileName);
}
</script>
service層程式碼:
@Override
public void downTemplate(String fileName) throws IOException {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (requestAttributes != null) {
HttpServletResponse response = requestAttributes.getResponse();
// 設定資訊給客戶端不解析
String type = new MimetypesFileTypeMap().getContentType(fileName);
if (response != null) {
// 設定content-type,即告訴客戶端所傳送的資料屬於什麼型別
response.setHeader("Content-type", type);
// 設定編碼
String code = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
// 設定擴充套件頭,當Content-Type 的型別為要下載的型別時 , 這個資訊頭會告訴瀏覽器這個檔案的名字和型別。
response.setHeader("Content-Disposition", "attachment;filename=" + code);
FileUtil.download(fileName, response);
}
}
}
controller層程式碼:
@GetMapping("/downTemplate")
public String downTemplate(@RequestParam("fileName") String fileName){
try {
studentService.downTemplate(fileName);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
工具包:
public class FileUtil {
public static void download(String fileName, HttpServletResponse response) throws IOException {
// 傳送給客戶端的資料
OutputStream outputStream = response.getOutputStream();
byte[] buff = new byte[1024];
BufferedInputStream bis = null;
// 讀取fileName
bis = new BufferedInputStream(new FileInputStream(new File("./file/" + fileName)));
int i = bis.read(buff);
while (i != -1) {
outputStream.write(buff, 0, buff.length);
outputStream.flush();
i = bis.read(buff);
}
}
}