您好,登錄后才能下訂單哦!
文件下載小技巧:
由于不能使用ajax直接下載文件,因此要做到無刷新頁面下載,可以采用以下方案:
1.使用ajax提交生成臨時文件存放到服務器,并返回文件名(建議文件路徑放置在指定的目錄下,只返回文件名即可,全文件名需要js文件中做轉碼)
2.根據返回結果,發送下載請求,參數:文件名
JS(前端采用layui),返回json格式: {"message":"測試導出數據.xlsx","result":true}
// 下載文件
$("#exportExt").on("click",function(){
// 友好提示信息
var msgIndex = layer.msg('數據下載中,由于數據較大,請耐心等候...11', {icon: 16,scrollbar: false,time: 0});
$.ajax({
type : 'post',
async : false, // 默認異步true,false表示同步
url : 'exp/createExpFile', // 生成文件,保存在服務器
dataType : 'json', // 服務器返回數據類型
data : {
startDate : $("#startDate").val(),
endDate : $("#endDate").val()
},
success : function(data) {
// 關閉提示信息
layer.close(msgIndex);
if(data.result == true) {
window.location.href='test/downLoad?fileName=' + data.message;
}
},
error : function(XMLHttpRequest, textStatus, e) {
// 關閉提示信息
layer.close(msgIndex);
layer.alert('導出數據失敗', {icon: 5});
}
});
});
Controller
@Autowired
TestService testService;
/**
* @描述: 生成下載文件
* @return
* @日期 2019年6月20日
*/
@RequestMapping("createExpFile")
@ResponseBody
public String createExpFile(){
return testService.createExpFile();
}
/**
* @描述: 導出下載文件
* @日期 2019年6月20日
*/
@RequestMapping("downLoadExt")
@ResponseBody
public void downLoadExt(){
testService.downLoadExt();
}
Service
下載文件請參考java導出數據到Excel文件
@Autowired
public HttpServletResponse response;
// 臨時文件目錄,這里指定一個目錄,實際應用建議動態獲取目錄
private static final String tempPath = "e:"+ "tempFile" + File.separator + "download" + File.separator;
/**
* @描述: 生成下載文件
* @return
* @日期 2019年6月20日
*/
public String createExpFile() {
// 文件存放目錄
String savePath = tempPath;
// 文件存放名稱
String fileName = "測試下載文件.xlsx";
// 1.獲取要導出的數據信息
List<String[]> dataList = getDownLoadData();
// 2.導出信息到Excel文件(參考https://blog.51cto.com/blogger/publish/2411391)
boolean expFlag = ToolExcelExp.exportBigDataExcel(savePath + fileName, dataList);
MessageBean messageBean = new MessageBean();
messageBean.setResult(expFlag);
messageBean.setMessage(fileName);
return JSONObject.toJSONString(messageBean);
}
/**
* @描述: 導出下載文件
* @日期 2019年6月20日
*/
public void downLoadExt() {
Map<String, Object> paramMaps = getMaps();
// 文件存放目錄
String savePath = tempPath;
// 文件存放名稱
String fileName = paramMaps.get("fileName").toString();
// 文件下載
ToolDownLoad.downloadFile(response, savePath + fileName);
System.out.println("導出完畢");
}
文件下載工具類
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.http.HttpServletResponse;
public class ToolDownLoad {
/**
* @描述: 文件下載
* @param response
* @param filePath 要下載的文件全路徑
* @日期 2019年6月19日
*/
public static void downloadFile(HttpServletResponse response, String filePath) {
response.setContentType("text/html;charset=utf-8");
System.out.println(filePath);
File file = new File(filePath);
String fileName = file.getName();
long fileLength = file.length();
if (file.exists()) {
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
response.setContentType("application/force-download");// 設置強制下載不打開
response.addHeader("Content-Disposition", "attachment; fileName=" + new String(fileName.getBytes("utf-8"), "ISO8859-1"));// 設置文件名
response.setHeader("Content-Length", String.valueOf(fileLength));
byte[] buffer = new byte[1024];
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
System.out.println("success");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 下載完畢,刪除文件
file.delete();
}
}
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。