1、文件名乱码问题:
如果是本地window,文件名是
String fileName = new String(fileName.getBytes("utf-8"),"ISO8859-1");
如果是linux,文件名是
String fileName = new String(fileName.getBytes("gb2312"),"ISO8859-1");
总结就是看服务器的文件编码类型进行判断。
2、内容错误问题:
我遇到的问题是本地下载文件内容正常,linux服务器上下载会把html代码也作为文件内容下载到文件中。
解决方案是把下载的java代码写到jsp的最开始,下载结束后再编写html代码,因为jsp代码执行顺序是:java>html>js。
当把response设置为文件后,就会输出流里的内容写到文件里,而不是页面上。
但是我本地window下载代码不管写到哪里下载内容都是正常的,可能和jar包有关吧,都是玄学,有遇到相同问题的可以试下。
<% //获取文件名
String fileName = request.getParameter("file_name");
fileName = new String(fileName.getBytes("gb2312"),"ISO8859-1");
//获取文件路径
String filePath = request.getParameter("file_path");
//下载文件
File file = new File(filePath);
String exists = null;
if(file.exists()){
exists = "true";
response.setContentType("application/x-download");
response.setHeader("content-disposition","attachment; filename=" + fileName );
long fileLength=file.length();
String length1=String.valueOf(fileLength);
response.setHeader("Content_Length",length1);
InputStream is = new FileInputStream(file);
ServletOutputStream os = response.getOutputStream();
os.flush();
int length = 0;
byte[] bytes = new byte[500];
while((length = is.read(bytes)) != -1){
os.write(bytes, 0, length);
}
os.flush();
os.close();
is.close();
out.clear();
out = pageContext.pushBody();
}else{
exists = "false";
}
%>
<%@ page language="java" import="java.util.*,java.io.* ,java.net.* "
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
session="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>文件下载</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<script type="text/javascript">
var exists = "<%=exists%>";
if(exists == "false"){
alert("文件不存在");
window.history.go(-1);
}else{
window.history.go(-1);
}
</script>
</body>
</html>