web项目部署到linux服务器上后,中文全乱码
需求:从前台界面上选择一个压缩包(zip,rar)上传;写到服务器指定的目录下;之后用命令解压;读取Excel解析数据入库;最后删除文件夹。
问题: 在windows也就是本地电脑上测试的时候,能将文件写入;在linux下,文件能写入,但是中文全是乱码;
syste.out.print()语句中中文也是乱码。
jsp如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%
String contextPath = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>数据导入</title>
<link href="<%=contextPath%>/css/css_bui/dpl.css" rel="stylesheet" />
<link href="<%=contextPath%>/css/css_bui/bui.css" rel="stylesheet" />
<link href="<%=contextPath%>/css/common.css" rel="stylesheet" />
<link href="<%=contextPath%>/css/popUpTable.css" rel="stylesheet" />
</head>
<body>
<div style="height: 100%; overflow-x: hidden;">
<div>
<fieldset>
<legend>接口检测数据</legend>
<div>
<br> <input id="importInterfaceData" type="button"
value="导入"/> <input id=""
type="button" value="校验"/>
<input id="upZip" type="button" value="批量导入"/>
</div>
<br>
</fieldset>
<fieldset>
<legend>动检车数据</legend>
<div>
<br> <input id="importCarData" type="button" value="导入">
<input id="" type="button" value="检验">
</div>
<br>
</fieldset>
<fieldset>
<legend>DMS数据</legend>
<div>
<br> <input id="importDMSData" type="button" value="导入">
<input id="" type="button" value="检验">
</div>
<br>
</fieldset>
<fieldset>
<legend>告警</legend>
<div>
<br> <input id="importAlarmData" type="button" value="导入">
<input id="" type="button" value="检验">
</div>
<br>
</fieldset>
</div>
<form id="importInterfaceDataForm" action="" method="post" enctype="multipart/form-data" accept-charset="UTF-8">
<span style="display: none"> <input type="file"
id="importInterfaceFile" name="importFile" webkitdirectory directory
onchange="submitInterfaceDataForm()" />
</span>
</form>
<form id="importZipForm" action="" method="post" enctype="multipart/form-data" accept-charset="UTF-8">
<span style="display: none"> <input type="file"
id="importZip" name="upZip" onchange="submitUpZipForm()" />
</span>
</form>
</div>
</body>
<script>
var contextPath = '<%=contextPath%>' + '/';
var railAdminId = '<%=session.getAttribute("railWayId")%>';
$('#importInterfaceData').on('click',function(){
$('#importInterfaceFile').trigger('click');
});
$("#upZip").on("click",function(){
$("#importZip").trigger("click");
});
function submitInterfaceDataForm(){
var formData=new FormData($("#importInterfaceDataForm")[0]);
dialogClose(lookDialog);
$.ajax({
url : contextPath + 'importDataAction/importInterfaceData.cn',
type : 'POST',
success : function(e) {
if (e) {
alert('上传完成');
} else {
alert("上传失败,查看失败原因");
}
},
data :formData,
cache : false,
contentType : false,
processData : false
});
}
function dialogClose(d){
d.close();
d = null;
}
function submitUpZipForm(){
var file=document.getElementById('importZip').value;
if(file.indexOf(".rar")==-1 && file.indexOf(".zip")==-1){
alert("该文件不是压缩文件,请选择压缩文件上传!");
document.getElementById('importZip').value="";
}else{
var formData=new FormData($("#importZipForm")[0]);
dialogClose(lookDialog);
$.ajax({
url : contextPath + 'importDataAction/importInterfaceData3.cn',
type : 'POST',
success : function(e) {
if (e) {
alert('上传完成');
} else {
alert("上传失败,查看失败原因");
}
},
data :formData,
cache : false,
contentType : false,
processData : false
});
}
}
</script>
</html>
java代码:
@RequestMapping(value = "/importInterfaceData3", method = RequestMethod.POST)
public @ResponseBody boolean importInterfaceData3(@RequestParam("upZip") MultipartFile file,
HttpServletRequest request) {
System.out.println("进入该方法");
String charSet=request.getCharacterEncoding();
System.out.println(charSet);
String name=null;
try {
name = new String(file.getOriginalFilename().getBytes("UTF-8"),"UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
System.out.println("文件名:"+name);
//将文件写入的路径
final String path="D:/压缩包";
// final String path="/opt/im_train_no";
try{
boolean b=writeFile(path,name,file);
System.out.println("文件写入是否完成:"+b);
//写入失败,直接结束
if(b==false){
return false;
}
String zipFile=path+"/"+name;
File f=new File(zipFile);
String folder=f.getParent();
//获得解压命令
String cmd = getCMD(name);
//文件解压缩
boolean flag=analysisZip(cmd);
//解压缩完成之后将源文件删除
if(flag){
f.delete();
}else{
System.out.println("解压失败");
return false;
}
f=new File(folder);
//保存所有的机车文件夹目录
List<File> folderList=new ArrayList<File>();
//找到对应的文件夹
getFolder(f,folderList);
//遍历文件夹,找到每个机车的所有文件
for(int i=0; i<folderList.size(); i++){
List<File> list=new ArrayList<File>();
//找到这个文件夹下的所有文件
filterFolder(folderList.get(i),list);
//只要Excel的文件
list=filterFileByType(list);
//只要名字满足的文件
list=fiterFileByName(list);
Map<String, List<List>> map=createExcelMap(list);
priService.importInterfaceData(map);
}
f=new File(path);
deleteFile(f);
return true;
}catch(Exception e){
e.printStackTrace();
}
return false;
}
/**
* 不同类型的压缩文件对应不同的解压命令
*/
private String getCMD(String name) {
String cmd="";
if(name.endsWith(".zip") || name.endsWith(".ZIP")){
cmd="unzip "+name;
}
if(name.endsWith(".rar")){
cmd="rar x "+name;
}
return cmd;
}
/**
* 删除文件及文件夹
*
* @param f
*/
private void deleteFile(File file) {
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
deleteFile(files[i]);
}
}
file.delete();
}
/**
* 将前台读到的文件写入服务器
* @param path
* @param name
* @param file
* @return
*/
private boolean writeFile(String path, String name, MultipartFile file) {
try{
File file1=new File(path);
if(file1.exists()){
//先删除该目录下的所有文件和目录(防止上次出现异常,没有执行最后的文件删除操作),再创建一个空目录
deleteFile(file1);
file1.mkdir();
}else{
file1.mkdir();
}
File file2=new File(path,name);
int count = 0, bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
bos = new BufferedOutputStream(new FileOutputStream(file2));
bis = new BufferedInputStream(file.getInputStream());
while ((count = bis.read(buffer, 0, bufferSize)) != -1)
{
bos.write(buffer, 0, count);
}
bos.flush();
bos.close();
return true;
}catch(Exception e){
e.printStackTrace();
}
return false;
}
/**
* 每个机车文件夹下的生成Map
* @param list
* @return
*/
private Map<String, List<List>> createExcelMap(List<File> list) {
//将所有的Excel存入Map中
Map<String,List<List>> map=new HashMap<String, List<List>>();
try{
for(int i=0; i<list.size(); i++){
Workbook workbook=WorkbookFactory.create(list.get(i));
String name=list.get(i).getName();
// System.out.println(name);
importData(workbook, name,map);
}
return map;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 获得所有的机车文件夹
* @param f
* @param folderList
*/
private void getFolder(File f, List<File> folderList) {
boolean flag=f.isDirectory();
if(flag){
File[] files=f.listFiles();
for(int i=0; i<files.length; i++){
if(files[i].isDirectory() && (files[i].getName().indexOf("机车")!=-1)){
folderList.add(files[i].getAbsoluteFile());
}else{
getFolder(files[i],folderList);
}
}
}
}
/**
* 通过文件名来过滤文件
* @param list
* @return
*/
private List<File> fiterFileByName(List<File> list) {
for(int i=0; i<list.size(); i++){
String name=list.get(i).getName();
if(name.indexOf("Abis测量")== -1 && name.indexOf("Abis切换")== -1
&& name.indexOf("Abis信令")== -1 && name.indexOf("A信令")== -1
&& name.indexOf("PRI呼叫记录")== -1 && name.indexOf("PRI信令")== -1
&& name.indexOf("A切换")==-1){
list.remove(i);
i=i-1;
}
}
return list;
}
/**
* 通过类型过滤文件
* @param list
* @return
*/
private List<File> filterFileByType(List<File> list) {
for(int i=0; i<list.size(); i++){
String name=list.get(i).getName();
if(!name.endsWith(".xls") && !name.endsWith(".xlsx")){
list.remove(i);
i=i-1;
}
}
return list;
}
/**
* 找到对应的文件夹和文件
* @param file
* @param list
*/
private void filterFolder(File file, List<File> list) {
if(file.isDirectory()){
File[] files=file.listFiles();
for(int i=0; i<files.length; i++){
filterFolder(files[i], list);
}
}else{
list.add(file.getAbsoluteFile());
}
}
/**
* 解压 压缩包
* @param cmd
* @return
*/
private boolean analysisZip(String cmd) {
try{
Process process=Runtime.getRuntime().exec(cmd);
process.waitFor();
}catch(Exception e){
return false;
}
return true;
}
/**
* 通过名字过滤掉不要的表格
* @param files
* @return
*/
private List<MultipartFile> filterByName(List<MultipartFile> files) {
for(int i=0; i<files.size(); i++){
String name=files.get(i).getOriginalFilename();
if(name.indexOf("Abis测量")== -1 && name.indexOf("Abis切换")== -1
&& name.indexOf("Abis信令")== -1 && name.indexOf("A信令")== -1
&& name.indexOf("PRI呼叫记录")== -1 && name.indexOf("PRI信令")== -1
&& name.indexOf("A切换")==-1){
files.remove(i);
i=i-1;
}
}
return files;
}
/**
* 过滤掉不是Excel格式的文件
* @param files
* @return
*/
private List<MultipartFile> filterByType(List<MultipartFile> files) {
for(int i=0; i<files.size(); i++){
String name=files.get(i).getOriginalFilename();
if(!name.endsWith(".xls") && !name.endsWith(".xlsx")){
files.remove(i);
i=i-1;
}
}
return files;
}