怎么使用Java完成下载excel文件,服务器上excel文件是直接存在的而不是导出的(必须使用action)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么使用Java完成下载excel文件,服务器上excel文件是直接存在的而不是导出的(必须使用action)相关的知识,希望对你有一定的参考价值。
直接使用IO读取写入,下载后打开文件提示:文件损坏是否恢复,但是可以恢复
我是直接使用FileInputStream读取传输的:
String str = "attachment;filename=";
String name="";
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
InputStream fis = null;
try
name = java.net.URLEncoder.encode(fileName + ".xlsx","UTF-8");
response.addHeader("Content-Disposition", str + new String(name.getBytes("UTF-8"),"UTF-8"));
fis = new FileInputStream(downFile);
request.setCharacterEncoding("utf8");
byte[] bytes = new byte[1024];
while(fis.read(bytes) != -1 )
response.getOutputStream().write(bytes);
response.getOutputStream().flush();
response.getOutputStream().close();
catch (Exception e)
e.printStackTrace();
finally
if(fis != null)
tryfis.close();catch(Exception e)
response.setContentType("application/octet-stream");
是这样设置吗?
这么设置也可以,但是这个设置语句得在所有输出语句之前才能生效,而且还得通过代码来传输文件,我个人认为这种方式纯粹多余,在Web.xml添加 ,多方便。
追问之前设置的是
response.setContentType("application/vnd.ms-excel");
后来改成
response.setContentType("application/octet-stream");
我都试了,结果一样,打开文件都出现这一句话:
Excel在“XXX.xlsx”中发现不可读取的内容。是否恢复此工作簿的内容?如果信任此工作簿的来源,请点击“是”。
点“是”可以恢复
action直接Redirect文件真实地址吧。
追问是不是用的流不对?难道要解析Excel再重新生成一个?
参考技术A action中直接打开文件,然后输出给response的流 参考技术B 改成byte[] b = new byte[2048];int len;
while ((len = fis.read(b)) != -1)
out.write(b, 0, len);
就没有报Excel在“XXX.xlsx”中发现不可读取的内容。是否恢复此工作簿的内容?如果信任此工作簿的来源,请点击“是”。 参考技术C 不管他什么文件 都是文件不是 只不过后缀不一样 就用文件流呗 . 后缀 能截取吧 原样输出呗
高分:用java实现服务器上多个文件先打包,然后下载,下载完成后删除包!
我想实现一个跟购物车一样的东西。把想下载的资源全部放到购物车里,购物车里存放的是文件的url,filename 等,然后点击购物车的打包下载时候,根据路径把购物车里面的所有文件进行打包,然后下载,下载完成后,删除服务器上残留的包!
我用的是struts2的commons-file做的上传跟下载!而且要保存的文件大多是图片跟视频类的,不可能放到数据库!
现在最难实现的,就是文件放在不同的文件夹内,怎么能把他们给整合打成一个包!
如果不能实现的话,就只能根据路径把所有文件复制到一个文件夹内,然后打包那个文件夹进行下载,下载后删除文件夹跟压缩包了。但是那样的话,会大大增加服务器的负荷!!!
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipTest
public static void main( String[] args )
try
writeZip();
catch ( IOException e )
e.printStackTrace();
private static void writeZip() throws IOException
String[] files = "/ws/dir1/file1", "/ws/dir2/file2", "/ws/file3", "/pub/success.wav" ;
OutputStream os = new BufferedOutputStream( new FileOutputStream( "/ws/archive.zip" ) );
ZipOutputStream zos = new ZipOutputStream( os );
byte[] buf = new byte[8192];
int len;
for ( String filename : files )
File file = new File( filename );
if ( !file.isFile() ) continue;
ZipEntry ze = new ZipEntry( file.getName() );
zos.putNextEntry( ze );
BufferedInputStream bis = new BufferedInputStream( new FileInputStream( file ) );
while ( ( len = bis.read( buf ) ) > 0 )
zos.write( buf, 0, len );
zos.closeEntry();
zos.close();
参考技术A jdk有个包--- java.util.jar
1 这个包里的类可以打包文件,具体做法可以参考API,看你的水平 通过API了解新类 应该不是问题了。
2 删除文件--不用说了吧,file.delete.....
3 下载就更加简单了, 用“流”将文件输出就可以了。
再不行??? 信息我吧。 但是不会给你源代码 只有给你思路了。追问
现在最难实现的,就是文件放在不同的文件夹内,怎么能把他们给整合打成一个包!
如果不能实现的话,就只能根据路径把所有文件复制到一个文件夹内,然后打包那个文件夹进行下载,下载后删除文件夹跟压缩包了。但是那样的话,会大大增加服务器的负荷!!!
不是吧 ,, 放在不同文件夹 也可以打包进去的。
参考技术B 可以把这些url,name暂存到session里面下载和上传可以使用插件jspsmart
很久没有使用了 稍微看一下API吧jspsmart就是把上传和下载的工作封装简化,所以使用非常简单的
下载完成后调用file.delete();就在服务器上删掉了 参考技术C 如果文件不是很大的话可以用字节数组保存已经上传的文件信息, 和内容.
然后在直接输出打包后的文件. 供下载使用.
如果文件很大的话要用临时文件了.
以上是关于怎么使用Java完成下载excel文件,服务器上excel文件是直接存在的而不是导出的(必须使用action)的主要内容,如果未能解决你的问题,请参考以下文章
请问下,我想用java实现下载excel表格,思路是先在临时文件里生成临时excel文件,但是不知
Java实现点击导出excel页面遮罩屏蔽,下载完成后解除遮罩