javaweb中,做的导出数据功能,数据导出的excel跑到服务器上了, 没导到用户本机上,求高手解答,另外求教怎么做导出时选择导出路径的方法
推荐于2016-03-21 11:03:38
最佳答案
一般来说做下载功能的确是先导到服务器的一个临时目录上的,然后再用一段代码把这个excel读出来,并且输出到response流里面去,给你一段可以用的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
//------------------------------
//step1. 保存一个临时excel到temp目录下
//------------------------------
//这部分自己实现,我相信你已经实现了
//假设你已经实现了保存一个excel到一个<a href="https://www.baidu.com/s?wd=%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6%E5%A4%B9&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d-PWnLujKWPjcvujmdn16Y0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPH6kn10znWcd" target="_blank" class="baidu-highlight">临时文件夹</a>里面去
//并且已经生成了一个File 指向这个临时的 excel,名叫exportFile
//-------------------------------
//step2. 弹出下载对话框
//-------------------------------
if
(exportFile ==
null
){
logger.error(
"生成excel错误! exportFile 为空"
);
return
;
}
//先建立一个文件读取流去读取这个临时excel文件
FileInputStream fs =
null
;
try
{
fs =
new
FileInputStream(exportFile);
}
catch
(FileNotFoundException e) {
logger.error(
"生成excel错误! "
+ exportFile +
" 不存在!"
,e);
return
;
}
// 设置响应头和保存文件名
HttpServletResponse response = ServletActionContext.getResponse();
//这个一定要设定,告诉浏览器这次请求是一个下载的数据流
response.setContentType(
"APPLICATION/OCTET-STREAM"
);
try
{
//这边的 "采购部门本月采购报表.xls" 替换成你自己要显示给用户的文件名
excelName = URLEncoder.encode(
"采购部门本月采购报表.xls"
,
"UTF-8"
);
}
catch
(UnsupportedEncodingException e1) {
logger.error(
"转换excel名称编码错误!"
,e1);
}
response.setHeader(
"Content-Disposition"
,
"attachment; filename=\""
+ excelName +
"\""
);
// 写出流信息
int
b =
0
;
try
{
//这里的 response 就是你 servlet 的那个传参进来的 response
PrintWriter out = response.getWriter();
while
((b = fs.read()) != -
1
) {
out.write(b);
}
fs.close();
out.close();
logger.debug(sheetName +
" 文件下载完毕."
);
}
catch
(Exception e) {
logger.error(sheetName +
" 下载文件失败!."
,e);
}
|
把这段代码放到你的servlet的最后一部分
其他回答
就是在jsp中用file标签就可以选择路径啦。然后你导出的时候你现在可能默认是在server的某个目录,你写成你页面选择的路径即可
qnmlgbbwc
发布于2013-08-16 09:35
评论
0
0
要导出到用户的电脑上就不叫导出了,叫做下载。路径问题也是选择下载路径就可以了。。和迅雷类似。用IO流直接将你要下载的数据写入到本地就可以了
妖精の血
发布于2013-08-16 10:29
评论
2
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
public
void
downLoadFile(String filePth) {
HttpServletResponse response = ServletActionContext.getResponse();
HttpServletRequest request = ServletActionContext.getRequest();
try
{
//得到当前路径
//String filePath=request.getSession().getServletContext().getRealPath(File.separator);
File temFile =
new
File(filePth);
if
(!temFile.exists()){
response.getWriter().write(
"ERROR:File Not Found"
);
return
;
}
String fileName = filePth.substring(filePth.lastIndexOf(File.separator)+
1
);
String browser = request.getHeader(
"<a href="
https:
//www.baidu.com/s?wd=user-agent&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d-PWnLujKWPjcvujmdn16Y0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPH6kn10znWcd" target="_blank" class="baidu-highlight">user-agent</a>");
Pattern p = Pattern.compile(
".*MSIE.*?;.*"
);
Matcher m = p.matcher(browser);
if
(m.matches()){
response.setHeader(
"Content-Disposition"
,
"attachment; filename="
+URLEncoder.encode(fileName,
"UTF-8"
).replace(
"+"
,
""
));
}
else
{
response.setHeader(
"Content-Disposition"
,
"attachment; filename="
+
new
String(fileName.getBytes(
"UTF-8"
),
"ISO8859-1"
).replace(
" "
,
""
));
}
response.setContentType(
"application/x-download"
);
OutputStream ot=response.getOutputStream();
BufferedInputStream bis =
new
BufferedInputStream(
new
FileInputStream(temFile));
BufferedOutputStream bos =
new
BufferedOutputStream(ot);
byte
[] buffer =
new
byte
[
4096
];
int
length =
0
;
while
((length = bis.read(buffer)) >
0
){
bos.write(buffer,
0
,length);
}
bos.close();
bis.close();
ot.close();
}
catch
(Exception e) {
e.printStackTrace();
}
}
|
张策是gou
发布于2013-08-16 09:34