【沫沫金】使用Serv-U FTP服务,搭建文件服务器
内网文件服务器安装Serv-U FTP
链接: https://pan.baidu.com/s/1G51D1enLqZCUhnprnjAITw 提取码: snah
Java Web工程,引入
commons-net.jar
拷贝工具类
package com.ytsoft.appservice.framework.utils; import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* ftp工具类,基于org.apache.commons.net.ftp
*/
public class FtpUtilCommons { private final static Logger logger = LoggerFactory.getLogger(FtpUtilCommons.class); private FTPClient ftpClient;
private String ipAddr;// ip地址
private Integer port;// 端口号
private String userName;// 用户名
private String pwd;// 密码
private String path;// 根目录
private String ysPath; // 原始目录
private String lsPath; // 历史目录
private String logPath; // log目录 public FtpUtilCommons(String ipAddr, Integer port, String userName, String pwd) {
this.ipAddr = ipAddr;
this.port = port;
this.userName = userName;
this.pwd = pwd;
} /**
* 本地字符编码
*/
private static String LOCAL_CHARSET = "GBK"; // FTP协议里面,规定文件名编码为iso-8859-1
private static String SERVER_CHARSET = "ISO-8859-1"; /**
* 获取ftp连接
*
* @param ftpVo
* @return
* @throws Exception
*/
public boolean connectFtp() throws Exception {
logger.info("获取ftp连接,username---" + this.userName);
boolean flag = false;
try {
ftpClient = new FTPClient();
ftpClient.setDataTimeout(18000 * 1000);
int reply;
if (this.getPort() == null) {
ftpClient.connect(this.getIpAddr(), 21);
} else {
ftpClient.connect(this.getIpAddr(), this.getPort());
}
if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
if (ftpClient.login(this.getUserName(), this.getPwd())) {
// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
LOCAL_CHARSET = "UTF-8";
}
ftpClient.setControlEncoding(LOCAL_CHARSET);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
logger.error("连接ftp失败,reply=" + reply);
return flag;
}
ftpClient.enterLocalPassiveMode();
Boolean boo = ftpClient.changeWorkingDirectory(this.getPath());
logger.info("获取ftp连接,切换的目录是否存在:" + boo + ",当前目录:" + getPath());
flag = true;
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error(this.getUserName() + ",连接ftp异常,e=" + e.getMessage()); }
return flag;
} /**
* 得到文件名称列表
*
* @return
*/
public String[] getFileNameList() {
String[] fileNames = null;
try {
ftpClient.setControlEncoding(LOCAL_CHARSET);
fileNames = ftpClient.listNames();
} catch (Exception e) {
e.printStackTrace();
logger.error("得到文件名称列表异常,e=" + e.getMessage());
}
return fileNames;
} /**
* 移动文件
*
* @param oldFileName
* @param newFileName
* @return
*/
public boolean rename(String oldFileName, String newFileName) throws Exception {
boolean flag = false;
try {
logger.info("ftp文件移动,oldFileName=" + oldFileName + ";newFileName=" + newFileName);
oldFileName = new String(oldFileName.getBytes(LOCAL_CHARSET), SERVER_CHARSET);
newFileName = new String(newFileName.getBytes(LOCAL_CHARSET), SERVER_CHARSET);
ftpClient.enterLocalPassiveMode();
flag = ftpClient.rename(oldFileName, newFileName);
logger.info("ftp文件移动结果," + flag);
} catch (Exception e) {
e.printStackTrace();
flag = false;
logger.error("ftp文件移动异常,从新连接FTP,e=" + e.getMessage());
connectFtp(); }
return flag;
} /**
* 关闭ftp连接
*/
public void closeFtp() {
logger.info("ftp关闭-start");
if (ftpClient != null && ftpClient.isConnected()) {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
logger.error("关闭ftp失败,e=" + e.getMessage());
}
}
logger.info("ftp关闭-end");
} /**
* ftp上传文件,针对数据采集自动化,上传错误日志
*
* @param file
* @param path
* 目录
* @throws Exception
*/
public String upload(File file, String path) throws Exception {
FileInputStream fis = null;
try {
boolean boo = ftpClient.changeWorkingDirectory(path);
logger.info("ftp上传文件,切换到log目录,boo=" + boo + ";Path:" + getPath());
logger.info("ftp上传文件,f===" + file.toString());
if (!file.exists()) {
return "文件不存在!";
}
File file2 = new File(file.getPath());
fis = new FileInputStream(file2);
ftpClient.enterLocalPassiveMode();
boolean boolen = ftpClient.storeFile(new String(file2.getName().getBytes(LOCAL_CHARSET), SERVER_CHARSET), fis);
logger.info("ftp上传文件,上传结果boolean=" + boolen);
if (!boolen) {
return "error";
}
} catch (Exception e) {
e.printStackTrace();
logger.error(this.getUserName() + "上传文件发生异常,重新连接ftp,e=" + e.getMessage());
connectFtp();
return "error";
} finally {
if (fis != null) {
fis.close();
}
ftpClient.changeWorkingDirectory("/YSSJ/");
}
logger.info("ftp上传文件完成");
return "success";
} /**
* 下载文件
*
* @param remoteFileName--服务器上的文件名
* @param localFileName--本地文件名
* @return true 下载成功,false 下载失败
*/
public boolean loadFile(String remoteFileName, String localFileName) throws Exception {
boolean flag = false;
// 下载文件
BufferedOutputStream buffOut = null;
try {
buffOut = new BufferedOutputStream(new FileOutputStream(localFileName));
flag = ftpClient.retrieveFile(new String(remoteFileName.getBytes(LOCAL_CHARSET), SERVER_CHARSET), buffOut);
} catch (Exception e) {
e.printStackTrace();
logger.error(this.getUserName() + "下载ftp文件异常,e=" + e.getMessage());
flag = false;
logger.error("下载ftp文件异常,重新连接一次FTP");
connectFtp(); } finally {
try {
if (buffOut != null)
buffOut.close();
} catch (Exception e) {
e.printStackTrace();
}
}
logger.info("下载ftp文件结果,flag=" + flag);
return flag;
} /**
* 删除ftp指定文件
*/
public String deleteFile(String filename) {
logger.info("删除ftp文件,filename=" + filename);
try {
ftpClient.deleteFile(filename);
return null;
} catch (Exception e) {
logger.error("删除ftp文件异常,e=" + e.getMessage());
return "删除文件失败!";
}
} /**
* 判断文件是否存在
*
* @param filename
* @return
*/
public Boolean getFileName(String filename) {
logger.info("判断文件在ftp是否存在,filename=" + filename);
try {
ftpClient.enterLocalPassiveMode();
FTPFile[] files = ftpClient.listFiles(filename);
if (files.length < 1) {
return false;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
logger.info("判断文件在ftp是否存在,存在!");
return true;
} /**
* 获得当前连接目录
*
* @return
*/
public String getPath() {
String path = null;
try {
path = ftpClient.printWorkingDirectory();
} catch (IOException e) {
e.printStackTrace();
}
return path;
} public static void main(String[] args) throws Exception {
/*
* FtpUtilCommons ftpUtil = new FtpUtilCommons(); FtpVo f=new FtpVo();
* f.setIpAddr("10.5.94.11"); f.setUserName("01606034X");
* f.setPwd("610929"); f.setPath("LOG/"); ftpUtil.connectFtp(f);
*
*
* File file = new File(
* "D:\\usr\\wonders\\JKK\\sjcj\\安康市白河县仓上镇(未办理身份证人员)258220161214-092640.log"
* ); ftpUtil.upload(file);//把文件上传在ftp上 System.out.println("ok");
* ftpUtil.closeFtp();
*/ FtpUtilCommons ftpUtil = new FtpUtilCommons("127.0.0.1", 21, "wyc", "123456");
System.out.println(ftpUtil.connectFtp());
String[] str = ftpUtil.getFileNameList(); System.out.println(str.length);
int i = 0;
for (String s : str) { System.out.println(s); }
// ftpUtil.upload(new
// File("F:\\ceshi\\安康市白河县西营镇7496.xlsx安康市白河县西营镇7496.xlsx"));
ftpUtil.closeFtp();
} public String getIpAddr() {
return ipAddr;
} public void setIpAddr(String ipAddr) {
this.ipAddr = ipAddr;
} public Integer getPort() {
return port;
} public void setPort(Integer port) {
this.port = port;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public String getLsPath() {
return lsPath;
} public void setLsPath(String lsPath) {
this.lsPath = lsPath;
} public String getLogPath() {
return logPath;
} public void setLogPath(String logPath) {
this.logPath = logPath;
} public void setPath(String path) {
this.path = path;
} }
下载
@GetMapping("/downloadFile/{fileName:.+}")
public Object downloadFile(@PathVariable String fileName, HttpServletRequest request, HttpServletResponse response) throws Exception {
JSONObject json = new JSONObject();
json.put("status", -1);
try {
// 如果文件名不为空,则进行下载
if (fileName != null) {
// 设置文件路径 String address = environment.getProperty("ftp.address");
String user = environment.getProperty("ftp.user");
String password = environment.getProperty("ftp.password"); String path = System.getProperty("java.io.tmpdir");
FtpUtilCommons ftpUtil = new FtpUtilCommons(address, null, user, password);
ftpUtil.connectFtp();
ftpUtil.loadFile(fileName, path + fileName);
ftpUtil.closeFtp(); File file = new File(path + fileName); // 如果文件名存在,则进行下载
if (file.exists()) { // 配置文件下载
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
// 下载文件能正常显示中文
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); // 实现文件下载
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
json.put("status", 1);
json.put("message", "文件下载成功");
json.put("data", "");
} catch (Exception e) {
throw new Exception("文件下载失败!");
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
file.delete();
}
}
}
} catch (Exception e) {
e.printStackTrace();
json.put("message", e.getMessage());
return json;
}
return json;
}
上传
@PostMapping("/uploadFile")
public Object uploadFile(@RequestParam("file") MultipartFile file, HttpServletRequest req) {
JSONObject json = new JSONObject();
json.put("status", -1);
try {
FileService fileService = new FileService();
String filePath = fileService.storeFile(file);
String address = environment.getProperty("ftp.address");
String user = environment.getProperty("ftp.user");
String password = environment.getProperty("ftp.password"); String path = System.getProperty("java.io.tmpdir");
String fileName = file.getOriginalFilename();
String s = fileName.substring(fileName.lastIndexOf("."), fileName.length());
String newFileName = UUID.randomUUID().toString().replace("-", "") + s;
File f = new File(path + newFileName);
file.transferTo(f); FtpUtilCommons ftpUtil = new FtpUtilCommons(address, null, user, password);
ftpUtil.connectFtp();
ftpUtil.upload(f, "");
ftpUtil.closeFtp(); f.delete(); UploadFileResponse uploadFileResponse = new UploadFileResponse(StringUtils.cleanPath(file.getOriginalFilename()), filePath, file.getContentType(), file.getSize());
HashMap<String, Object> data = new HashMap<String, Object>();
data.put("ID", "");
data.put("SETID", req.getParameter("SETID"));
data.put("FILENAME", newFileName);
data.put("ATTACHEDFILE", uploadFileResponse.getFileDownloadUri()); fileMapper mapper = firstSqlSessionFactory.getMapper(fileMapper.class); int i = mapper.insert(data);
if (i == 1) {
// 更新到故障表单
ProblemFromMapper pfm = firstSqlSessionFactory.getMapper(ProblemFromMapper.class);
HashMap<String, Object> updateFileMap = new HashMap<String, Object>();
updateFileMap.put("ID", req.getParameter("ID"));
updateFileMap.put("INCUSERATTACHMENT15", data.get("ID"));
int j = pfm.updateFile(updateFileMap); json.put("status", 1);
json.put("message", "文件上传成功");
}
} catch (Exception e) {
e.printStackTrace();
json.put("message", e.getMessage());
return json;
}
return json;
}
就可以了。
【沫沫金】使用Serv-U FTP服务,搭建文件服务器的更多相关文章
- linux之FTP服务搭建 ( ftp文件传输协议 VSFTPd虚拟用户)
FTP服务搭建 配置实验之前关闭防火墙 iptables -F iptables -X iptables -Z systemctl stop firewalld setenforce 0 1.ftp简 ...
- CentOS7 FTP服务搭建(虚拟用户访问FTP服务)
概述 最近在搞Oracle在Linux系统下集群,针对Linux系统,笔人也是一片空白.Liunx外部文件的传输,避免不了使用FTP服务,所以现在就整理下,CentOS7环境下,FTP服务的搭建.FT ...
- FTP服务搭建与配置
FTP介绍 大企业用的基本都是自动化发布工具,会用GIT企业发布的版本上传到服务器, 使用vsftpd搭建ftp服务(上) http://blog.csdn.net/qq_26941173/artic ...
- linux下FTP服务搭建(1)
1.FTP介绍: FTP (File Transfer Protocol,文件传输协议)主要用来文件传输,尤其适用于大文件传输,提供上传下载功能 FTP官方网站:https://filezilla-p ...
- ftp服务搭建
文件传输服务 主配置文件目录/etc/vsftpd/vsftpd.conf 首先安装ftp服务器 yum install vsftpd 默认存放文件的目录 /var/ftp/pub 匿名登陆 创建一 ...
- Debian系统下的ftp服务搭建
安装vsftpd服务 $ sudo apt install vsftpd 配置参数 命令输入 $ vim /etc/vsftpd.conf 使用如下配置 # Example config file / ...
- FTP服务搭建配置笔记
1.什么是文件共享服务? 简单来说就是文件域存储块设备可以共享给他人使用. 1.1 实现文件共享服务的三种方式 FTP:属于应用层服务,可以跨平台使用 NFS:属于内核模式,不可以跨平台使用 Samb ...
- FTP 服务搭建后不能访问问题解决
主要是需要启动身份验证功能
- centos 6.5 ftp服务配置及客户端使用
一.ftp服务简介 FTP是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Ap ...
随机推荐
- 58)PHP,后台登录步骤示意图
注意上面的action提交位置: 并且注意下面的两个东西:
- 吴裕雄--天生自然python学习笔记:python文档操作插入图片
向 Word 文件中插入图片 向 Word 文件插入图片的语法为: 例如,在 cl ip graph.docx 文件的第 4 段插入 ce ll.jpg 图片,井将图片文件保存于 Word 文件内: ...
- 【转】mac os x配置adb命令的方法,苹果电脑设置adb命令的方法
http://www.myexception.cn/operating-system/1636963.html 步骤如下: 1. 启动终端Terminal (如果当前用户文件夹下已有.bash_pro ...
- 【转】Mac下显示User下的资源Library
在Mac OS 中Library文件夹是默认不显示的,这对普通用户来说是有好处的,可以防止用户误操作删除Library文件夹,但对于iOS的开发者来说是非常麻烦的,特别是ArcGIS Runtime ...
- 华为OD两轮技术面试
华为OD面试1性格测试选积极向上的选项,注意,性格测试也会挂人,我一个朋友性格测试就没过.2机试 一道变成题目 1h 用例60%通过即可任给一个数组,元素有20M,1T,300G之类的,其中1T=10 ...
- springboot 配置热部署 及 热部署后依旧是404的坑
springboot配置热部署的教程网上一大堆: 个人喜欢这种方式: https://www.cnblogs.com/winner-0715/p/6666579.html 本文主要强调的是,大家如果配 ...
- fiddler模拟返回响应数据
通过find查找修改指定内容 选择find a file 保存后重新发起请求
- Java日期时间API系列12-----Jdk8中java.time包中的...
package com.xkzhangsan.time.test; import java.time.LocalDateTime;import java.util.Date; import com.x ...
- VS自身的单元测试方法DEMO
///用来修饰测试类 [TestClass()] public class Program { private TestContext testContextInstance; /// <sum ...
- SpringMVC学习笔记一:采用注解式搭建简单springMVC环境
搭建的环境使用的是maven项目 项目目录树: 搭建环境使用的jar包,pom.xml文件 <project xmlns="http://maven.apache.org/POM/4. ...