之前我需要做一个excel合并行导出的文件,并且需要导出到指定位置
excel合并行文件制作之前已经发过文章了,你们可以去参考前面的
这篇文章我主要聊聊文件导出指定位置
首先我是主要用ajax去请求文件生成存储的路径
$.ajax({
url:url,
type:"post",
data:data,
dataType:"json",
headers:{
'X-CSRF-TOKEN':$csrftoken
},
success:function(response){
if (response.success){
let dowUrl = $ctx + "/service/rest/tk.File/" + response.fileId + "/download";
window.open(dowUrl);
}else {
alert(response.msg);
}
}
});
后台那个文件存储到指定位置,我首先想到的是
JFileChooser jfc=new JFileChooser();
具体操作可自行百度
本来我用了JFileChooser选择文件夹,直接获取一个本地路径创建一个输出流
wb.write(rfile.openOutputStream());
在使用代码下载到本地
本来在本地运行没啥问题,可我将代码提交到线上去,运行就出现了问题,我根据日志出现了以下问题
java.awt.HeadlessException
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:204)
at java.awt.Window.<init>(Window.java:536)
at java.awt.Frame.<init>(Frame.java:420)
at java.awt.Frame.<init>(Frame.java:385)
at javax.swing.SwingUtilities$SharedOwnerFrame.<init>(SwingUtilities.java:1758)
at javax.swing.SwingUtilities.getSharedOwnerFrame(SwingUtilities.java:1833)
at javax.swing.JOptionPane.getRootFrame(JOptionPane.java:1696)
at javax.swing.JOptionPane.getWindowForComponent(JOptionPane.java:1637)
at javax.swing.JFileChooser.createDialog(JFileChooser.java:802)
at javax.swing.JFileChooser.showDialog(JFileChooser.java:749)
at javax.swing.JFileChooser.showOpenDialog(JFileChooser.java:656)
at
我整了接近一个小时,还没有解决,我就觉得JFileChooser这个可能有问题,然后拿出我自己的电脑访问我本地项目去导出,结果就在我自己页面上点导出按钮,文件选择器却出现在公司电脑上。后面我就去查询了一下JFileChooser,发现也有其他同志出现了一样的问题,JFileChooser只能在服务端运用,不能运用到客户端
接下来我就尝试将文件下载到客户端,注释掉了文件选择器
String fileName="客户端下载.xlsx";
OutputStream output = response.getOutputStream();
response.reset();
response.setHeader("Content-disposition", "attachment; filename=" +fileName);
response.setContentType("*/*");
response.setCharacterEncoding("utf-8");
output.flush();
wb.write(output);
output.close();
可是执行完这段代码之后,屁都没有放一个,而我也是简单操作下,也不懂这是什么意思,就只能寻求公司大佬帮助了
后来才了解,这个是把我们需要导出的excle文件转化为一个导出流放入response中,交给浏览器去获取流
可是我之前调用这个方法用的是ajax,导致浏览器不能反应,所以就出现了以上情况
后面公司大佬就给我整了下面一段
String fileId = UUID.generateUUID();
/*将流暂时存储到服务器,在根据浏览器去下载*/
com.homolo.toolkit.filesystem.File rfile = this.storage.createFile(fileId, fileName);
wb.write(rfile.openOutputStream());
rfile.setOwner(UserSessionFactory.currentUser().getPersonId());
rfile.setType("xlsx");
rfile.setAttribute(Constants.FILE_IS_TEMP_KEY, true);
rfile.setDateExpired(DateUtils.addDays(new Date(), 2));
rfile.save();
咱们公司有一个已经封装的,暂存创建一个根据文件名称和文件id的文件,存储到公司的服务器中
然后根据我们公司封装的下载代码
if (response.success){
let dowUrl = $ctx + "/service/rest/tk.File/" + response.fileId + "/download";
window.open(dowUrl);
}else {
alert(response.msg);
}
将流再次交给浏览器去操作。
至于公司封装的东西,我就不好给大家介绍了,至于问题就差不多是这样了,嘻嘻,撤了