Springboot?返回文件給前端的示例代碼
更新時間:2023年07月05日 11:24:29 作者:屎碼程序員
這篇文章主要介紹了Springboot?返回文件給前端的示例代碼,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
首先導(dǎo)入數(shù)據(jù)到excel中
package com.ds.crawler.search.service.thirdParty; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Date; import java.util.List; import com.ds.model.CrawlerModel; import com.ds.model.CrawlerResultModel; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExportToExcel { public static Boolean exportToExcel(List<CrawlerModel> products){ // 創(chuàng)建工作簿對象 XSSFWorkbook workbook = new XSSFWorkbook(); // 創(chuàng)建工作表對象 Sheet sheet = workbook.createSheet("products"); // 創(chuàng)建表頭行 Row header = sheet.createRow(0); header.createCell(0).setCellValue("ID"); header.createCell(1).setCellValue("site"); header.createCell(2).setCellValue("name"); header.createCell(3).setCellValue("price"); header.createCell(4).setCellValue("unit"); header.createCell(5).setCellValue("time"); header.createCell(6).setCellValue("source"); header.createCell(7).setCellValue("type"); header.createCell(8).setCellValue("size"); header.createCell(9).setCellValue("color"); header.createCell(10).setCellValue("img"); header.createCell(11).setCellValue("material"); header.createCell(12).setCellValue("rank"); // 填充數(shù)據(jù) int rowNum = 1; for (CrawlerModel product : products) { Row row = sheet.createRow(rowNum); row.createCell(0).setCellValue(rowNum); row.createCell(1).setCellValue(product.getSite()==null?"":product.getSite()); row.createCell(2).setCellValue(product.getName()==null?"":product.getName()); row.createCell(3).setCellValue(((product.getPrice()==null?"":product.getPrice().toString()))); row.createCell(4).setCellValue(product.getUnit()==null?"":product.getUnit()); row.createCell(5).setCellValue(product.getTime()==null?"":product.getTime()); row.createCell(6).setCellValue(product.getSource()==null?"":product.getSource()); row.createCell(7).setCellValue(product.getType()==null?"":product.getType()); row.createCell(8).setCellValue(product.getSize()==null?"":product.getSize().toString()); row.createCell(9).setCellValue(product.getColor()==null?"":product.getColor().toString()); row.createCell(10).setCellValue(product.getImg()==null?"":product.getImg().toString()); row.createCell(11).setCellValue(product.getMaterial()==null?"":product.getMaterial()); row.createCell(12).setCellValue(product.getRank()==null?"":product.getRank().toString()); rowNum++; } // 將數(shù)據(jù)寫入Excel文件 FileOutputStream outputStream = null; try { outputStream = new FileOutputStream("products.xlsx"); workbook.write(outputStream); workbook.close(); outputStream.close(); return true; } catch (IOException e) { throw new RuntimeException(e); } } }
之后就會看到到處的excel文件了:
創(chuàng)建接口返回文件到前端:
package com.ds.crawler.search.controller; import com.ds.common.exception.BizCodeEnume; import com.ds.common.exception.RRException; import com.ds.common.result.Result; import com.ds.crawler.search.service.MallSearchService; import com.ds.crawler.search.service.thirdParty.ExportToExcel; import com.ds.model.CrawlerResultModel; import com.ds.model.SearchParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Slf4j @RestController @RequestMapping("/search/product") @CrossOrigin public class ExportConroller { @Autowired MallSearchService mallSearchService; @GetMapping("/export") public ResponseEntity<byte[]> export(SearchParam param, HttpServletResponse response) throws IOException { // 1、 根據(jù)要求查詢數(shù)據(jù) CrawlerResultModel result = mallSearchService.search(param); if (result!=null&&result.getProduct()!=null){ // 2、 將數(shù)據(jù)導(dǎo)入excel Boolean b = ExportToExcel.exportToExcel(result.getProduct()); // 3、轉(zhuǎn)為字節(jié)流返回給前端 if(b){ File file = new File("E:\\GonZuoShi\\java\\crawler\\crawler-es\\products.xlsx"); // 將Excel文件讀取到字節(jié)數(shù)組中 FileInputStream fileInputStream = new FileInputStream(file); byte[] bytes = new byte[(int) file.length()]; fileInputStream.read(bytes); fileInputStream.close(); // 設(shè)置響應(yīng)頭 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("application/vnd.ms-excel")); headers.setContentDispositionFormData("attachment", "products.xlsx"); // 返回響應(yīng)實體 return ResponseEntity.ok() // .headers(headers) // .contentLength(bytes.length) .body(bytes); }else{ //拋出異常 throw new RRException(BizCodeEnume.EXPORT_TO_EXCEPTION.getMsg(),BizCodeEnume.EXPORT_TO_EXCEPTION.getCode()); } }else{ //拋出異常 throw new RRException(BizCodeEnume.EXPORT_TO_EXCEPTION.getMsg(),BizCodeEnume.EXPORT_TO_EXCEPTION.getCode()); } } }
這樣前端就收會收到一個二進(jìn)制的文件流
前端獲取文件流:
使用axios 請求:
創(chuàng)建request:
exportExcel(data){ return request{ url:'....', port:get, data:data, responseType:'arraybuffer', } }
調(diào)用:
proxy.$api.downloadcode({site:store.state.siteName}).then(res=>{ const link=document.createElement('a'); // let blob = new Blob([res.data],{type: 'applicationnd.ms-excel'}); //如果后臺返回的不是blob對象類型,先定義成blob對象格式 try { let blob = new Blob([res.data], { type: 'application/octet-stream' }) //如果后臺返回的直接是blob對象類型,直接獲取數(shù)據(jù) // let _fileName = res.headers['content-disposition'].split(';')[1].split('=')[1]; //拆解獲取文件名, link.style.display='none'; // 兼容不同瀏覽器的URL對象 const url = window.URL || window.webkitURL || window.moxURL; link.href=url.createObjectURL(blob); link.download =`${store.state.siteName}.xlsx`; //下載的文件名稱 link.click(); window.URL.revokeObjectURL(url); // #URL.revokeObjectURL()方法會釋放一個通過URL.createObjectURL()創(chuàng)建的對象URL. 當(dāng)你要已經(jīng)用過了這個對象URL,然后要讓瀏覽器知道這個URL已經(jīng)不再需要指向?qū)?yīng)的文件的時候,就需要調(diào)用這個方法. }catch(e){ console.log('下載的文件出錯',e) } })
到此這篇關(guān)于Springboot 返回文件給前端的文章就介紹到這了,更多相關(guān)Springboot 返回給前端內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot Redis配置多數(shù)據(jù)源的項目實踐
springboot中默認(rèn)的redis配置是只能對單個redis庫進(jìn)行操作的, 那么我們需要多個庫操作的時候這個時候就可以采用redis多數(shù)據(jù)源 ,本文就介紹了SpringBoot Redis配置多數(shù)據(jù)源,感興趣的可以了解一下2023-07-07java序列化和serialVersionUID的使用方法實例
這篇文章主要介紹了java序列化和serialVersionUID的使用方法實例的相關(guān)資料,這里說明很詳細(xì)的使用方法讓你徹底學(xué)會,需要的朋友可以參考下2017-08-08