工具类:
package com.xxx.xxx.excel.ftp;
import com.xxx.utils.date.DateUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.*;
import java.net.SocketException;
import java.net.URLEncoder;
import java.util.Date;
/**
* FTP公共服务工具
* @author: big bug bean
*/
public class FtpUtil {
private final static Log logger = LogFactory.getLog(FtpUtil.class);
/**
* 获取FTPClient对象
* @param ftpHost FTP主机服务器
* @param ftpPassword FTP 登录密码
* @param ftpUserName FTP登录用户名
* @param ftpPort FTP端口 默认为21
* @return
*/
public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort,String path,String name,FileInputStream local) {
FTPClient ftpClient = null;
try {
ftpClient = new FTPClient();
ftpClient.connect(ftpHost, ftpPort); // 连接FTP服务器
ftpClient.login(ftpUserName, ftpPassword); // 登陆FTP服务器
ftpClient.setControlEncoding("GBK"); // 中文支持
// 指定上传文件的类型 二进制文件
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
logger.info("未连接到FTP,用户名或密码错误。");
ftpClient.disconnect();
} else {
logger.info("FTP连接成功。");
}
} catch (SocketException e) {
e.printStackTrace();
logger.info("FTP的IP地址可能错误,请正确配置。");
} catch (IOException e) {
e.printStackTrace();
logger.info("FTP的端口错误,请正确配置。");
}
return ftpClient;
}
/**
* 通过浏览器的方式从ftp下载文件
* 用户名xx
* 密码:xxxxx
* url:ftp://uftp:Ftp.1024@10.xx.xx.xx/xxx/2019-10-31/xxx.xls
* @param ftpHost FTP IP地址
* @param ftpUserName FTP 用户名
* @param ftpPassword FTP用户名密码
* @param ftpPort FTP端口
* @param ftpPath FTP服务器中文件所在路径 格式: xxx/xxx
* @param fileName FTP服务器上要下载的文件名称
*/
public static String downloadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath,String folderName, String fileName) {
String url = null;
try {
// String f_ame = new String(fileName.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING); //编码文件格式,解决中文文件名
String f_ame = URLEncoder.encode(fileName, "GBK");//编码文件名,支持中文文件名(本人菜,这段代码来之不易。。)
url = "ftp://"+ftpUserName+":"+ftpPassword+"@"+ftpHost+ftpPath+"/"+folderName+"/"+f_ame+"";
return url;
} catch (IOException e) {
e.printStackTrace();
logger.error("下载文件错误");
e.printStackTrace();
}
return url;
}
/**
*
* @param ftpHost
* @param ftpUserName
* @param ftpPassword
* @param ftpPort
* @param ftpPath
* @param fileName
* @param local
* @return
*/
public static boolean uploadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String fileName, FileInputStream local) {
boolean result = false;
FTPClient ftpClient = null;
try {
int reply;
ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort,ftpPath,fileName,local);
ftpClient.changeWorkingDirectory(ftpPath);
reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
return result;
}
fileName = new String(fileName.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING); //编码文件名,支持中文文件名
//在指定的ftp文件夹目录创建新文件夹存放当天上传的文件
String ymd = DateUtils.dateToStr(new Date(),"yyyy-MM-dd");
ftpClient.makeDirectory(ymd);
// 指定上传路径
ftpClient.changeWorkingDirectory(ftpPath+"/"+ymd);
if (!ftpClient.storeFile(fileName, local)) {
return result;
}
local.close();
ftpClient.logout();
result = true;
} catch (FileNotFoundException e) {
logger.error("没有找到" + ftpPath + "文件");
e.printStackTrace();
} catch (SocketException e) {
logger.error("连接FTP失败.");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
logger.error("文件读取错误。");
e.printStackTrace();
}
return result;
}
}
前端代码
doUpLoadFtpExcel: function () {
var file = $("#fileftp").val();
//没有选择文件清空
if(!file){
return;
}
var exec = (/[.]/.exec(file)) ? /[^.]+$/.exec(file.toLowerCase()) : '';
if (exec != "xls") {
alert("文件格式错误!");
return false;
}
document.domain = location.hostname;
jQuery.ajaxFileUpload({
url: httpurl+'user/importFtpExcel?token='+TokenUtils.getToken(),
secureuri: false,
fileElementId: "fileftp",
dataType: 'json',
type: "post",
success: function(data) {
debugger;
if(data.code == 2){//上传文件名重复
alert(data.msg);
$("#coverUpLoadExcel").attr("style","display:block;");
$("#stillUploadExcel").attr("style","display:block");
$("#doUpLoadFtpExcel").attr("style","display:none;");
}else{
alert(data.msg);
$("#ftpFileUpload").modal("hide");
}
},
error: function(data,index) {
debugger;
LayerUtils.show(data.msg)
$("#ftpFileUpload").modal("hide");
}
});
},
<!-- 自定义弹框提示 本地Excel上传-->
<div class="modal fade" id="fileUpload">
<div class="modal-dialog">
<div class="modal-content" style="color: #333;text-align: inherit; background: #fff;">
<div class="modal-body">
<input type="file" name="file" id="file111" />
</div>
<div class="modal-footer" style="padding: 0;">
<button type="button" class="btn btn-default" v-on:click="upLoadExcel()">上传</button>
<button type="button" class="btn btn-default" id="window_alert_model_close" data-dismiss="modal">关闭</button>
</div>
</div>
<!-- /.modal-content -->
</div>
<!-- /.modal-dialog -->
</div>
<div class="modal fade" id="ftpFileUpload">
<div class="modal-dialog">
<div class="modal-content" style="color: #333;text-align: inherit; background: #fff;">
<div class="modal-body">
<input type="file" name="fileftp" id="fileftp" />
</div>
<div class="modal-footer" style="padding: 0;">
<button type="button" class="btn btn-default" id="doUpLoadFtpExcel" v-on:click="doUpLoadFtpExcel">上传</button>
<button type="button" class="btn btn-default" id="coverUpLoadExcel" v-on:click="coverUpLoadExcel">覆盖上传</button>
<button type="button" class="btn btn-default" id="stillUploadExcel" v-on:click="stillUploadExcel">直接上传</button>
<button type="button" class="btn btn-default" id="window_alert_model_close" data-dismiss="modal">关闭</button>
</div>
</div>
<!-- /.modal-content -->
</div>
<!-- /.modal-dialog -->
</div>
uploadFtpExcel: function () {
$("#ftpFileUpload").modal("show");
$("#coverUpLoadExcel").attr("style","display:none;");
$("#stillUploadExcel").attr("style","display:none");
$("#doUpLoadFtpExcel").attr("style","display:block;");
},
控制层
/**
* 从ftp导出文件
*/
@ResponseBody
@RequestMapping("/downLoadFromFtp")
@RequiresPermissions("user:list")
public Result downLoadFromFtp(HttpServletResponse res,String folderName,String name) throws IOException{
Result result= new Result();
try {
//校验文件在表里是否存在记录
List<SysFtp> listSysFtp = sysFtpService.findList(name,folderName);
if(listSysFtp.size()>0){
// ftp服务器下载
String url = FtpUtil.downloadFtpFile(environment.getProperty("ftp.hostname"),
environment.getProperty("ftp.username"),
environment.getProperty("ftp.password"),
Integer.valueOf(environment.getProperty("ftp.port")),
environment.getProperty("ftp.path"),folderName,name);
result.setData(url);
result.setMsg("下载文件成功");
return result;
}else{
result.setMsg("下载文件失败:文件不存在");
return result;
}
} catch (Exception e) {
e.printStackTrace();
}
result.setMsg("下载文件失败");
return result;
}
doUpLoadFtpExcel: function () {
var file = $("#fileftp").val();
//没有选择文件清空
if(!file){
return;
}
var exec = (/[.]/.exec(file)) ? /[^.]+$/.exec(file.toLowerCase()) : '';
if (exec != "xls") {
alert("文件格式错误!");
return false;
}
document.domain = location.hostname;
jQuery.ajaxFileUpload({
url: httpurl+'user/importFtpExcel?token='+TokenUtils.getToken(),
secureuri: false,
fileElementId: "fileftp",
dataType: 'json',
type: "post",
success: function(data) {
debugger;
if(data.code == 2){//上传文件名重复
alert(data.msg);
$("#coverUpLoadExcel").attr("style","display:block;");
$("#stillUploadExcel").attr("style","display:block");
$("#doUpLoadFtpExcel").attr("style","display:none;");
}else{
alert(data.msg);
$("#ftpFileUpload").modal("hide");
}
},
error: function(data,index) {
debugger;
LayerUtils.show(data.msg)
$("#ftpFileUpload").modal("hide");
}
});
},