1.不同浏览器对HTTP的URL参数编译不一致;
我遇到的情况是低版本的IE对中文参数进行编码导致乱码;
解决:使用js中的encodeURI函数来对URL地址进行编码(UTF-8)
然后后台解码即可。
JSP:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
function a_click(obj){
obj.href=encodeURI(obj.href);
return true;
}
</script>
<title>Test Page</title>
</head>
<body>
<h1>根目录:</h1>
<c:forEach items="${listRoot }" var="file" varStatus="status">
<span>硬盘:<a href="/DownLocalFile/sf?url=${file }" οnclick="a_click(this)">${file }</a></span>
</c:forEach>
<h2>url:${returnUrl }</h2>
<c:forEach items="${listDirectory }" var="file">
<span>文件夹:<a href="/DownLocalFile/sf?url=${returnUrl }/${file }" οnclick="a_click(this)">${file }</a></span>
<br/>
</c:forEach>
<c:forEach items="${listFile }" var="file">
<span>文件:<a href="/DownLocalFile/dlf?url=${returnUrl }/${file }" οnclick="a_click(this)">${file }</a></span><br/>
</c:forEach>
<br/>
</body>
</html>
JAVA:
1.Search File Class
package com.maxtt.servlet;
import java.io.File;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SearchFile extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String url = req.getParameter("url");
if(null!=url)
url = URLDecoder.decode(url,"utf-8");
//获取根目录
List<String> listRoot = new ArrayList<String>();
for(File f : getFile(null) ){
listRoot.add(f.getPath().replace("\\", ""));
}
req.setAttribute("listRoot", listRoot);
//获取url目录
File[] files = getFile(url);
List<String> listFile = new ArrayList<String>();
List<String> listDirectory = new ArrayList<String>();
for(File f : files ){
if(f.isFile()){
listFile.add(f.getName());
}else{
listDirectory.add(f.getName());
}
}
req.setAttribute("returnUrl", url);
req.setAttribute("listFile", listFile);
req.setAttribute("listDirectory", listDirectory);
//跳转
req.getRequestDispatcher("/Test.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
private File[] getFile(String url){
if(null == url || url.isEmpty()){
return File.listRoots();
}
File file = new File(url);
return file.exists() ? file.listFiles() : File.listRoots();
}
}
在文件下载的时候也出现了中文乱,使用UTF-8解码再用ISO8859-1编码。
2.DownLoad File Class
package com.maxtt.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownLoadFile extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String url = req.getParameter("url");
if(null==url){
return;
}
File file = new File(url);
if(file.exists()&&file.isFile()){
//获取响应的输出流
OutputStream os = resp.getOutputStream();
byte[] buff = new byte[1000];
//解决中文乱码
resp.setHeader("Content-disposition", "attachment;filename="+new String(file.getName().getBytes("UTF-8"),"ISO8859-1"));
String fileLength = String.valueOf(file.length());
resp.setHeader("Content-Length", fileLength);//下载文件时显示的长度
FileInputStream inputStream = new FileInputStream(file); //读取文件流
while(inputStream.read(buff)!=-1){
os.write(buff);//写出
}
inputStream.close();
os.close();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}