Windows搭建FTP服务器
- 目录
- 博主介绍
- 🌟博主介绍
- 开启FTP功能
- 放行端口
- 重启计算机
- 添加FTP访问用户
- 添加FTP站点
- 本地访问测试
- 修改FTP设置
- Java整合FTP代码实现
- 🌟作者相关的文章、资源分享🌟
- 💫点击直接资料领取💫
目录
博主介绍
🌟博主介绍
💂 个人主页:苏州程序大白
🤟作者介绍:中国DBA联盟(ACDU)成员,全国各地程序猿(媛)聚集地管理员。目前从事工业自动化软件开发工作。擅长C#、Java、机器视觉、底层算法等语言。2019年成立柒月软件工作室。
💬如果文章对你有帮助,欢迎关注、点赞、收藏(一键三连)和C#、Halcon、python+opencv、VUE、各大公司面试等一些订阅专栏哦
🎗️ 承接各种软件开发项目
💅 有任何问题欢迎私信,看到会及时回复
开启FTP功能
首先打开控制面板–>程序–>启用或关闭Windows功能:
勾选FTP服务、Web管理工具、万维网服务:
点击完成,等待生效:
放行端口
打开Windows防火墙–>允许应用通过防火墙–>点击更改设置,勾选FTP服务器的公用和专用:
重启计算机
完成上面的操作后,重启计算机。
添加FTP访问用户
可选操作,如果是设置匿名访问FTP,或者直接使用Windows已有的用户,就不用创建用户。
打开计算机管理功能–>本地用户和组,选择用户,右键新用户:
设置用户名和密码,勾选不能修改密码和密码永不过期,取消勾选其他的,点击创建:
添加FTP站点
打开计算机管理功能,在服务中找到Internet Information Services
,选中左侧用户,右键添加FTP站点:
自定义站点名称,选择FTP要共享的文件路径:
设置IP地址为本机IP地址,端口默认21就行,如果没有SSL就选无SSL:
勾选身份验证为基本,选择授权为指定用户,指定可以访问的用户,勾选权限为写入和读取(这里可根据具体情况自定义,如果要设置匿名访问的话就勾选匿名,然后允许访问里面选择所有用户),然后点击确定:
本地访问测试
文件管理器输入ip地址加端口:
鼠标右键,选择登录(如果没有弹出登录界面的话,匿名访问则无此操作)
输入用户名和密码点击登录:
可以正常访问:
修改文件名测试是否可以进行修改:
测试远程访问FTP(需要在同一个网络环境下):
完成上面步骤,就可以访问呢。
修改FTP设置
打开计算机管理功能,在服务中找到Internet Information Services,展开计算机用户–>网站,双击创建的FTP服务器,然后就可以进行各种修改了:
- 添加所有用户访问:
双击FTP身份验证,启用匿名身份验证:
双击FTP授权规则,右键添加允许规则:
选择所有用户,然后勾选读取和写入权限,点击确定即可,再次访问时就不用输入密码了。
Java整合FTP代码实现
FTP文件删除实现:
package org.example;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import java.io.File;
import java.io.IOException;
/**
* @author 苏州程序大白
* @create 2021/12/16
* @desc 文件删除 (暂未实现删除路径内子文件夹功能)
*/
public class DeleteFTP {
/**
* @param pathName 要删除文件/目录所在ftp路径
* @param fileName 要删除文件所在ftp的文件名
* @param ftpClient FTPClient对象
*/
public void deleteFTP(String pathName, String fileName, FTPClient ftpClient) {
try {
ftpClient.changeWorkingDirectory(pathName);// 跳转到文件目录
ftpClient.enterLocalPassiveMode(); //设置被动模式传输
if (fileName != null && fileName != "") {
//文件名不为空,删除指定文件
ftpClient.deleteFile(pathName + File.separator + fileName);
System.out.println("删除成功");
} else {
//文件名为空,删除路径下所有文件
System.out.println("正在删除");
//删除文件
FTPFile[] files = ftpClient.listFiles();//获取目录下文件集合
for (FTPFile file : files) {
if (file.isFile()) {
//判断为文件,直接删除
ftpClient.deleteFile(pathName + File.separator + file.getName());
System.out.println(file + ":已完成删除操作");
}
if (file.isDirectory()) {
/*有点问题,建议使用线程优化
//判断是文件夹,递归删除子文件夹内文件
deleteFTP(pathName + File.separator + file.getName(), null, ftpClient);
*/
}
}
//删除文件夹
ftpClient.removeDirectory(pathName);
System.out.println("删除操作完成");
}
} catch (Exception e) {
System.out.println("删除失败");
e.printStackTrace();
} finally {
//关闭连接
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
FTP文件下载实现:
package org.example;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* @author 苏州程序大白
* @create 2021/12/16
* @desc 文件下载(暂未实现下载路径内子文件中文件功能)
*/
public class DownloadFTP {
/**
* @param pathName 要下载文件所在ftp路径
* @param fileName 要下载文件所在ftp的文件名
* @param downloadPath 文件下载后保存的路径
* @param ftpClient FTPClient对象
*/
public void downLoadFTP(String pathName, String fileName, String downloadPath, FTPClient ftpClient) {
OutputStream outputStream = null;
try {
ftpClient.changeWorkingDirectory(pathName);// 跳转到文件目录
ftpClient.enterLocalPassiveMode(); //设置被动模式传输
if (fileName != null && fileName != "") {
//文件名不为空,下载指定文件
File filePath = new File(downloadPath);
if (!filePath.exists()) {
filePath.mkdir();//目录不存在,创建目录
}
outputStream = new FileOutputStream(new File(downloadPath + File.separator + fileName));
ftpClient.retrieveFile(fileName, outputStream);
System.out.println("下载操作完成");
} else {
FTPFile[] files = ftpClient.listFiles();//获取目录下文件集合
//文件名为空,下载路径下所有文件(不包含文件夹)
for (FTPFile file : files) {
File filePath = new File(downloadPath);
if (!filePath.exists()) {
filePath.mkdir();//目录不存在,创建目录
}
File downloadFile = new File(downloadPath + File.separator + file.getName());
outputStream = new FileOutputStream(downloadFile);
ftpClient.retrieveFile(file.getName(), outputStream);
System.out.println("下载操作完成:" + downloadFile);
}
}
} catch (Exception e) {
System.out.println("下载失败");
e.printStackTrace();
} finally {
//关闭连接
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != outputStream){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
连接FTP代码实现:
package org.example;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.IOException;
import java.net.MalformedURLException;
/**
* @author 苏程序大白
* @create 2021/12/16
* @desc 连接FTP服务链接
*/
public class InitFTP {
//ftp服务器IP
private static final String host = "127.0.0.1";
//ftp服务器端口号默认为21
private static final Integer port = 21;
//ftp登录账号
private static final String username = "ahzoo";
//ftp登录密码
private static final String password = "123456";
public void initFtpClient(FTPClient ftpClient) {
ftpClient.setControlEncoding("utf-8"); //设置编码
try {
System.out.println("正在连接FTP服务器:" + host + ":" + port);
ftpClient.connect(host, port); //连接ftp服务器
ftpClient.login(username, password); //登录ftp服务器
int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
if(!FTPReply.isPositiveCompletion(replyCode)){
System.out.println("FTP服务器连接失败:" + host + ":" + port);
}
System.out.println("FTP服务器连接成功:" + host + ":" + port);
}catch (MalformedURLException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
移动文件所在ftp路径代码实现:
package org.example;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import java.io.File;
import java.io.IOException;
/**
* @author 苏程序大白
* @create 2021/12/16
* @desc 文件移动/重命名
*/
public class MoveFTP {
/**
* @param pathName 要移动文件所在ftp路径
* @param fileName 要移动文件所在ftp的文件名
* @param movePath 文件移动后的路径
* @param moveName 文件移动后的文件名(与源文件一致时实现只移动不重命名,不一致则实现了移动+重命名)
* @param ftpClient FTPClient对象
*/
public void moveFTP(String pathName, String fileName, String movePath, String moveName, FTPClient ftpClient) {
try {
ftpClient.enterLocalPassiveMode(); //设置被动模式传输
if (!ftpClient.changeWorkingDirectory(movePath)) {
//跳转到目标路径失败时创建目标目录
ftpClient.makeDirectory(movePath);
}
if (moveName != null && moveName != "") {
ftpClient.changeWorkingDirectory(pathName);// 跳转回需要进行操作的目录
//移动后的文件名不为空,移动目标文件
//ftpClient.rename(旧文件名, 新路径)
ftpClient.rename(fileName, movePath + File.separator + moveName);
System.out.println("文件移动操作已完成:" + movePath + File.separator + moveName);
} else {
//移动后的文件名为空,移动目标路径所有文件
ftpClient.changeWorkingDirectory(pathName);// 跳转回需要进行操作的目录
FTPFile[] files = ftpClient.listFiles();//获取目录下文件集合
for (FTPFile file : files) {
ftpClient.rename(file.getName(), movePath + File.separator + file.getName());
System.out.println("移动操作完成:" + file.getName());
}
}
} catch (Exception e) {
System.out.println("移动失败");
e.printStackTrace();
} finally {
//关闭连接
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
读取文件所在ftp路径代码实现:
package org.example;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import java.io.*;
/**
* @author 苏程序大白
* @create 2021/12/16
* @desc 文件读取(暂未实现读取路径内子文件中文件功能)
*/
public class ReadFTP {
/**
* @param pathName 要读取文件所在ftp路径
* @param fileName 要读取文件所在ftp的文件名
* @param ftpClient FTPClient对象
*/
public void readFTP(String pathName, String fileName, FTPClient ftpClient) {
InputStream inputStream = null;
BufferedReader reader = null;
try {
System.out.println(pathName);
ftpClient.changeWorkingDirectory(pathName);// 跳转到文件目录
ftpClient.enterLocalPassiveMode(); //设置被动模式传输
if (fileName != null && fileName != "") {
//文件名不为空,读取指定文件
inputStream = ftpClient.retrieveFileStream(fileName);
reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
String fileL;
StringBuffer buffer = new StringBuffer();
while(((fileL=reader.readLine()) != null)){
buffer.append(fileL);
}
System.out.println(fileName + ":" + buffer.toString());
} else {
FTPFile[] files = ftpClient.listFiles();//获取目录下文件集合
//文件名为空,读取路径下所有文件(不包含文件夹)
System.out.println(files);
for (FTPFile file : files) {
System.out.println(file.getName());
inputStream = ftpClient.retrieveFileStream(file.getName());
System.out.println(inputStream);
reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
String fileL = null;
StringBuffer buffer = new StringBuffer();
while(((fileL=reader.readLine()) != null)){
buffer.append(fileL + "\n");
}
System.out.println(file + ":" + buffer.toString());
//retrieveFileStream使用了流,需要释放一下,不然会返回空指针
ftpClient.completePendingCommand();
}
}
} catch (Exception e) {
System.out.println("读取失败");
e.printStackTrace();
} finally {
//关闭连接
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != reader) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
上传到ftp服务器的路径代码实现:
package org.example;
import org.apache.commons.net.ftp.FTPClient;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* @author 苏程序大白
* @create 2021/12/16
* @desc 文件上传
*/
public class UploadFTP {
/**
* @param pathName 文件上传到ftp服务器的路径
* @param fileName 文件上传到ftp服务器的名称
* @param originPath 要上传文件所在的路径(绝对路径)
**/
public void uploadFile(String pathName, String fileName, String originPath, FTPClient ftpClient){
InputStream inputStream = null;
try{
System.out.println("文件传输中");
inputStream = new FileInputStream(new File(originPath));//将文本数据转换为输入流
ftpClient.enterLocalPassiveMode(); //设置被动模式传输
ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);//以二进制文件形式输入
ftpClient.makeDirectory(pathName);//在ftp服务器创建目标路径
ftpClient.changeWorkingDirectory(pathName);//切换到目标路径
ftpClient.enterLocalPassiveMode();//开启端口
ftpClient.storeFile(fileName, inputStream);//开始上传,inputStream表示数据源。
//ftpClient.storeFile(new String(fileName.getBytes("UTF-8"),"ISO-8859-1") inputStream);
System.out.println("文件上传操作完成");
}catch (Exception e) {
System.out.println("文件上传失败");
e.printStackTrace();
}finally{
//关闭连接
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
文本写入到ftp服务器的路径代码实现:
package org.example;
import org.apache.commons.net.ftp.FTPClient;
import java.io.*;
/**
* @author 苏程序大白
* @create 2021/12/16
* @desc 文本写入
*/
public class WriteFTP {
/**
* @param pathName 文本写入到ftp服务器的路径
* @param fileName 文本写入到ftp服务器的名称
* @param contentText 要写入的文本数据
**/
public void writeFile(String pathName, String fileName, String contentText, FTPClient ftpClient){
InputStream inputStream = null;
try{
System.out.println("开始写入操作");
inputStream = new ByteArrayInputStream(contentText.getBytes());//将文本数据转换为输入流,通过getBytes()方法避免中文乱码
ftpClient.enterLocalPassiveMode(); //设置被动模式传输
ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);//以二进制文件形式输入
ftpClient.makeDirectory(pathName);//在ftp服务器创建目标路径
ftpClient.changeWorkingDirectory(pathName);//切换到目标路径
ftpClient.enterLocalPassiveMode();//开启端口
ftpClient.storeFile(fileName, inputStream);//开始写入,inputStream表示数据源。
System.out.println("文本写入操作完成");
}catch (Exception e) {
System.out.println("文本写入失败");
e.printStackTrace();
}finally{
//关闭连接
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}