Windows搭建FTP服务器
目录
博主介绍
🌟博主介绍
开启FTP功能
放行端口
重启计算机
添加FTP访问用户
添加FTP站点
本地访问测试
修改FTP设置
Java整合FTP代码实现
🌟作者相关的文章、资源分享🌟
💫点击直接资料领取💫
目录
博主介绍
🌟博主介绍
💂 个人主页:苏州程序大白
💂 个人社区:CSDN全国各地程序猿
🤟作者介绍:中国DBA联盟(ACDU)成员,CSDN全国各地程序猿(媛)聚集地管理员。目前从事工业自动化软件开发工作。擅长C#、Java、机器视觉、底层算法等语言。2019年成立柒月软件工作室。
💬如果文章对你有帮助,欢迎关注、点赞、收藏(一键三连)和C#、Halcon、python+opencv、VUE、各大公司面试等一些订阅专栏哦
🎗️ 承接各种软件开发项目
💅 有任何问题欢迎私信,看到会及时回复
👤 微信号:stbsl6,微信公众号:苏州程序大白
🎯 想加入技术交流群的可以加我好友,群里会分享学习资料
开启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代码实现
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(); } } } } }=
🌟作者相关的文章、资源分享🌟
🌟让天下没有学不会的技术🌟
学习C#不再是难问题
🌳《C#入门到高级教程》🌳
有关C#实战项目
👉C#RS232C通讯源码👈
👉C#委托数据传输👈
👉C# Modbus TCP 源代码👈
👉C# 仓库管理系统源码👈
👉C# 欧姆龙通讯Demo👈
👉C#+WPF+SQL目前在某市上线的车管所摄像系统👈
👉2021C#与Halcon视觉通用的框架👈
👉2021年视觉项目中利用C#完成三菱PLC与上位机的通讯👈
👉VP联合开源深度学习编程(WPF)👈
✨有关C#项目欢迎各位查看个人主页✨
🌟机器视觉、深度学习🌟
学习机器视觉、深度学习不再是难问题
🌌《Halcon入门到精通》🌌
🌌《深度学习资料与教程》🌌
有关机器视觉、深度学习实战
👉2021年C#+HALCON视觉软件👈
👉2021年C#+HALCON实现模板匹配👈
👉C#集成Halcon的深度学习软件👈
👉C#集成Halcon的深度学习软件,带[MNIST例子]数据集👈
👉C#支持等比例缩放拖动的halcon WPF开源窗体控件👈
👉2021年Labview联合HALCON👈
👉2021年Labview联合Visionpro👈
👉基于Halcon及VS的动车组制动闸片厚度自动识别模块👈
✨有关机器视觉、深度学习实战欢迎各位查看个人主页✨
🌟Java、数据库教程与项目🌟
学习Java、数据库教程不再是难问题
🍏《JAVA入门到高级教程》🍏
🍏《数据库入门到高级教程》🍏
有关Java、数据库项目实战
👉Java经典怀旧小霸王网页游戏机源码增强版👈
👉js+css类似网页版网易音乐源码👈
👉Java物业管理系统+小程序源码👈
👉JavaWeb家居电子商城👈
👉JAVA酒店客房预定管理系统的设计与实现SQLserver👈
👉JAVA图书管理系统的研究与开发MYSQL👈
✨有关Java、数据库教程与项目实战欢迎各位查看个人主页✨
🌟分享Python知识讲解、分享🌟
学习Python不再是难问题
🥝《Python知识、项目专栏》🥝
🥝《Python 检测抖音关注账号是否封号程》🥝
🥝《手把手教你Python+Qt5安装与使用》🥝
🥝《用一万字给小白全面讲解python编程基础问答》🥝
🥝《Python 绘制Android CPU和内存增长曲线》🥝
🥝《☀️苏州程序大白用万字解析Python网络编程与Web编程☀️《❤️记得收藏❤️》》🥝
有关Python项目实战
👉Python基于Django图书管理系统👈
👉Python管理系统👈
👉2021年9个常用的python爬虫源码👈
👉python二维码生成器👈
✨有关Python教程与项目实战欢迎各位查看个人主页✨
🌟分享各大公司面试题、面试流程🌟
面试成功不是难事
🍏《2021年金九银十最新的VUE面试题☀️《❤️记得收藏❤️》》🍏
🍏《只要你认真看完一万字☀️Linux操作系统基础知识☀️分分钟钟都吊打面试官《❤️记得收藏❤️》》🍏
🍏《❤️用一万字给小白全面讲解python编程基础问答❤️《😀记得收藏不然看着看着就不见了😀》》🍏
✨有关各大公司面试题、面试流程欢迎各位查看个人主页✨