Windows10中搭建ftp服务器以实现文件传输

2023-11-10

开启ftp服务:

1、打开控制面板=====》程序和功能=====》 启用或关闭Windows功能

 

2、找到Internet Information Services,开启以下服务

 

 

 勾选之后,ftp服务开启成功

配置IIS,搭建ftp

 1、Win+S键搜索iis,回车打开=====》右击网站 =====》添加FTP站点

 

在这里插入图片描述

填写FTP站点名称和物理路径,下一步。 

 

 填写IP地址(可直接填写0.0.0.0),选中无SSL,下一步

 全勾上,完成。

 ftp服务搭建完成!

使用文件传输工具测试是否可以连接ftp:

 填写ip地址和端口号,点击连接,弹出一个窗口的话点击确认

 如果能看到右下角的目录,且目录正确则表示连接成功,ftp可用

注意:如果要使用另一台电脑进行连接,则需要将两台电脑连在同一个局域网下,并且关闭作为ftp服务器主机的防火墙。 

如果无法连接,可以关闭防火墙和杀毒软件。

 

上面的全部关闭。

接着打开控制面板=====》Windows Defender防火墙=====》允许应用或功能通过防火墙

 

 更改设置=====》找到FTP服务器,勾选=====》允许其他应用

浏览=====》找到对应目录 

 

 点击打开,添加,确定。

 再试试能否连接ftp服务器。

ftpUtil工具类:

package com.kgc.ymw.util;

import org.apache.commons.net.ftp.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

/**
 * @author: BruceYoung
 * @date: 2023/5/23
 */
@SuppressWarnings({"all"})
public class FtpUtil {

    private String Control_Encoding = "UTF-8";

    private FTPClient client = null;

    private String host = "";
    private int port = 21;
    private String user = "";
    private String password = "";
    private String ftpPath = "/";

    @SuppressWarnings("unused")
    private FtpUtil() {
    }

    public FtpUtil(String host, int port, String user, String pwd) {
        this.host = host;
        this.port = port;
        this.user = user;
        this.password = pwd;
    }

    /**
     * 获取当前FTP所在目录位置
     *
     * @return
     */
    public String getHome() {
        return this.ftpPath;
    }

    /**
     * 连接FTP Server
     *
     * @throws IOException
     */
    public static final String ANONYMOUS_USER = "anonymous";

    public void connect() throws Exception {
        if (client == null) {
            client = new FTPClient();
        }
        // 已经连接
        if (client.isConnected()) {
            return;
        }

        // 编码
        client.setControlEncoding(Control_Encoding);

        try {
            // 连接FTP Server
            client.connect(this.host, this.port);
            // 登陆
            if (this.user == null || "".equals(this.user)) {
                // 使用匿名登陆
                client.login(ANONYMOUS_USER, ANONYMOUS_USER);
            } else {
                client.login(this.user, this.password);
            }
            // 设置文件格式
            client.setFileType(FTPClient.BINARY_FILE_TYPE);
            // 获取FTP Server 应答
            int reply = client.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                client.disconnect();
                throw new Exception("connection FTP fail!");
            }

            FTPClientConfig config = new FTPClientConfig(client.getSystemType().split(" ")[0]);
            config.setServerLanguageCode("zh");
            client.configure(config);
            // 使用被动模式设为默认
            client.enterLocalPassiveMode();
            // 二进制文件支持
            client.setFileType(FTP.BINARY_FILE_TYPE);
            // 设置模式
            client.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);

        } catch (IOException e) {
            throw new Exception("connection FTP fail! " + e);
        }
    }

    /**
     * 断开FTP连接
     *
     * @param ftpClient
     * @throws IOException
     */
    public void close() {
        if (client != null && client.isConnected()) {
            try {
                client.logout();
                client.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取文件列表
     *
     * @return
     */
    public List<FTPFile> list() {
        List<FTPFile> list = null;
        try {
            FTPFile ff[] = client.listFiles(ftpPath);
            if (ff != null && ff.length > 0) {
                list = new ArrayList<FTPFile>(ff.length);
                Collections.addAll(list, ff);
            } else {
                list = new ArrayList<FTPFile>(0);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 切换目录
     *
     * @param path
     *            需要切换的目录
     * @param forcedIncrease
     *            如果目录不存在,是否增加
     */
    public void switchDirectory(String path, boolean forcedIncrease) {
        try {
            if (path != null && !"".equals(path)) {
                boolean ok = client.changeWorkingDirectory(path);
                if (ok) {
                    this.ftpPath = path;
                } else if (forcedIncrease) {
                    // ftpPath 不存在,手动创建目录
                    StringTokenizer token = new StringTokenizer(path, "\\//");
                    while (token.hasMoreTokens()) {
                        String npath = token.nextToken();
                        client.makeDirectory(npath);
                        client.changeWorkingDirectory(npath);
                        if (ok) {
                            this.ftpPath = path;
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建目录
     *
     * @param path
     */
    public void createDirectory(String path) {
        try {
            if (path != null && !"".equals(path)) {
                boolean ok = client.changeWorkingDirectory(path);
                if (!ok) {
                    // ftpPath 不存在,手动创建目录
                    StringTokenizer token = new StringTokenizer(path, "\\//");
                    while (token.hasMoreTokens()) {
                        String npath = token.nextToken();
                        client.makeDirectory(npath);
                        client.changeWorkingDirectory(npath);
                    }
                }
            }
            client.changeWorkingDirectory(this.ftpPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除目录,如果目录中存在文件或者文件夹则删除失败
     *
     * @param path
     * @return
     */
    public boolean deleteDirectory(String path) {
        boolean flag = false;
        try {
            flag = client.removeDirectory(path);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 删除文件
     *
     * @param path
     * @return
     */
    public boolean deleteFile(String path) {
        boolean flag = false;
        try {
            flag = client.deleteFile(path);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 上传文件,上传文件只会传到当前所在目录
     *
     * @param localFile
     *            本地文件
     * @return
     */
    public boolean upload(File localFile) {
        return this.upload(localFile, "");
    }

    /**
     * 上传文件,会覆盖FTP上原有文件
     *
     * @param localFile
     *            本地文件
     * @param reName
     *            重名
     * @return
     */
    public boolean upload(File localFile, String reName) {
        boolean flag = false;
        String targetName = reName;
        // 设置上传后文件名
        if (reName == null || "".equals(reName)) {
            targetName = localFile.getName();
        }
        FileInputStream fis = null;
        try {
            // 开始上传文件
            fis = new FileInputStream(localFile);
            client.setControlEncoding(Control_Encoding);
            client.setFileType(FTPClient.BINARY_FILE_TYPE);
            boolean ok = client.storeFile(targetName, fis);
            if (ok) {
                flag = true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 下载文件,如果存在会覆盖原文件
     *
     * @param ftpFileName
     *            文件名称,FTP上的文件名称
     * @param savePath
     *            保存目录,本地保存目录
     * @return
     */
    public boolean download(String ftpFileName, String savePath) {
        boolean flag = false;

        File dir = new File(savePath);

        if (!dir.exists()) {
            dir.mkdirs();
        }

        FileOutputStream fos = null;
        try {
            String saveFile = dir.getAbsolutePath() + File.separator + ftpFileName;
            fos = new FileOutputStream(new File(saveFile));
            boolean ok = client.retrieveFile(ftpFileName, fos);
            if (ok) {
                flag = true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }

    public static void main(String args[]) {

        // 创建FTP对象
        FtpUtil ftp = new FtpUtil("127.0.0.1", 21, "myftp", "myftp@2020");
        try {
            // 连接FTP
            ftp.connect();

            // 移动工作空间、切换目录
            System.out.println("当前位置:" + ftp.getHome());
            ftp.switchDirectory("/test", true);
            System.out.println("当前位置:" + ftp.getHome());

            // 查询目录下的所有文件夹以及文件
            List<FTPFile> list = ftp.list();
            System.out.println("|-- " + ftp.getHome());
            for (FTPFile f : list) {
                System.out.println(" |-- [" + (f.getType() == 0 ? "文件" : "文件夹") + "]" + f.getName());
            }

            // 上传文件
            boolean r1 = ftp.upload(new File("C:\\Users\\joymt\\Documents\\ftp\\测试文件1.txt"), "测试文件2.txt");
            System.out.println("上传文件:" + r1);

            // 下载文件
            boolean r2 = ftp.download("测试文件2.txt", "C:\\Users\\joymt\\Documents\\ftp");
            System.out.println("下载文件:" + r2);

            // 删除文件
            boolean r3 = ftp.deleteFile("/test/测试文件2.txt");
            System.out.println("删除文件:" + r3);

            // 删除目录
            boolean r4 = ftp.deleteDirectory("/test");
            System.out.println("删除目录:" + r4);

        } catch (Exception e) {
            e.printStackTrace();
        }

        ftp.close();
    }

}

工具类最后有测试代码。

ftp依赖:

        <!-- ftp文件上传依赖 -->
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.6</version>
        </dependency>

文件上传代码:

public Map<String, Object> insertSelective(Product product, MultipartFile file, HttpServletRequest request) throws Exception {
        HashMap<String, Object> map = new HashMap<>();
        String filename = file.getOriginalFilename();
        String extension = FilenameUtils.getExtension(filename);
        if (!(extension.equals("png") || extension.equals("pneg") || extension.equals("jpg") || extension.equals("jpeg"))) {
            map.put("msg", "文件格式不正确");
            return map;
        }
        if (file.getSize() == 0) {
            map.put("msg", "文件不能为空");
            return map;
        }
        if (file.getSize() > 5 * 1024 * 1024) {
            map.put("msg", "文件大小超过5M");
            return map;
        }
        String newFilename = UUID.randomUUID().toString() + "." + extension;

        // 创建FTP对象
        FtpUtil ftp = new FtpUtil("127.0.0.1", 21, null , null);
        // 连接FTP
        ftp.connect();
        System.out.println("当前位置:" + ftp.getHome());
        String path = request.getSession().getServletContext().getRealPath("upload");
        File file1 = new File(path, newFilename);
        if (!file1.exists()){
            file1.mkdirs();
        }
        file.transferTo(new File(path, newFilename));
        // 上传文件
        boolean r1 = ftp.upload(file1, newFilename);
        System.out.println("上传文件:" + r1);
        //关闭连接
        ftp.close();

        if (StringUtils.isEmpty(product.getCategorylevel2id())) {
            product.setCategorylevel2id(0);
        }
        if (StringUtils.isEmpty(product.getCategorylevel3id())) {
            product.setCategorylevel3id(0);
        }
        product.setId(UUID.randomUUID().toString());
        product.setIsdelete(0);
        product.setFilename(newFilename);
        product.setCreatedate(new Date());

        if (productMapper.insertSelective(product) != 1) {
            throw new Exception("数据库添加失败!");
        }
        solrClient.addBean(product);
        solrClient.commit();

        return map;
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows10中搭建ftp服务器以实现文件传输 的相关文章

  • Springboot集成Jasypt实现配置文件加密

    不容错过的成长之旅 Jasypt介绍 Jasypt是一个java库 它允许开发员以最少的努力为他 她的项目添加基本的加密功能 并且不需要对加密工作原理有深入的了解 用于单向和双向加密的高安全性 基于标准的加密技术 加密密码 文本 数字 二进
  • 解决Windows10中文用户名带来软件无法打开的影响

    众所周知 许多国外的开发软件都不支持中文的文件路径名 即使软件的路径无中文字符 可你系统用户的名称是中文 同样软件无法运行 因为大部分软件的在电脑用户上的缓冲文件都是在 C user 你的用户名称 AppData local temp 解决
  • Power BI和Tableau对比分析,到底要学哪个?

    Power BI和Tableau对比分析 到底要学哪个 一 两个工具优缺点 Power BI Tableau 二 职业需求 前程无忧 智联招聘 三 总结 学习tableau还是power bi想必是很多初学者的疑惑 可以从以下两个角度去考虑
  • 一台服务器想用150个ip,可以吗?

    不可以 一台服务器一次只支持一个ip 可以更换 但每次绑定一个 如果需要多个ip 只能多开服务器 挂店铺的 包括淘宝店铺 拼多多店铺 亚马逊店铺都想店铺不被关联 想买台服务器 可以的 一个店铺买一台服务器 有几个店铺就买几台服务器 ip的带
  • 数据结构:(代码篇:004)二叉搜索树 BST(二叉查找树)的基本操作

    1 基本概念 二叉搜索树 是二叉树是真子集 要求 根节点大于或等于左子树的节点值 小于右子树的节点值 他的中序遍历是有序的 基本操作有 查找 插入 删除 建树 查找和插入以及建树都很简单 和二叉树的差不多 删除略微复杂 2 存储结构 str
  • Apche Kafka + Spring的消息监听容器

    目录 一 消息的接收 1 1 消息监听器 二 消息监听容器 2 1 实现方法 2 1 1 KafkaMessageListenerContainer 2 1 1 1 基本概念 2 1 1 2 如何使用 KafkaMessageListene
  • SpringMVC异常处理

    1 概述 SpringMVC 框架处理异常的常用方式 使用 ExceptionHandler 注解处理异常 2 ExceptionHandler注解和用 ControllerAdvice注解 2 1 ExceptionHandler注解 使
  • VIVADO软件错误及解决办法汇总

    在VIVADO软件编写程序时会遇到很多类型的错误 写个博客记录下来防止再犯 短期可能只有几个问题 会长期保持更新 遇到问题就记录 2022 4 09 问题1 The debug port u ila 0 probe4 has 1 uncon
  • 盘点C# 8.0中好用的特性

    增加引用类型可为null 如果参数t是null 则会发出警告 public static void Test
  • CocosCreator3.8研究笔记(十八)CocosCreator UI组件(二)

    前面的文章已经介绍了Canvas 组件 UITransform 组件 Widget 组件 想了解的朋友 请查看 CocosCreator3 8研究笔记 十七 CocosCreator UI组件 一 今天我们主要介绍CocosCreator
  • OPENCV基础(图像,视频)

    文章目录 1 图像读取 展示 写入 2 视频读取 展示 写入 1 图像读取 展示 写入 使用cv imread 函数读取图像 使用函数cv imshow 在窗口中显示图像 使用函数cv imwrite 保存图像 import numpy a
  • InputStream为什么不能被重复读取?

    最近上传阿里云的时候同一个文件上传两个服务地址 第一个文件读取以后第二个再去读取就拿不到了 代码如下 内网上传OSS获取key值 String ossKey OSSClientUtil getOSSURL endpoint accessKe
  • kali linux 安装搜狗输入法(解决安装后只有搜狗五笔的问题)

    kali 安装搜狗输入法 解决安装后之后只有搜狗五笔的问题 第一步 去搜狗输入法的官方网站下载搜狗输入法 https pinyin sogou com linux 下载后打开文件所在路径 sougoupinyin 2 3 1 0112 am
  • unity读取json文件乱码以及Invalid character 'v' in input string异常解决方案

    先说PC端吧 PC端乱码很容易解决 itemsTable JsonMapper ToObject File ReadAllText Application dataPath Scripts Json itemsTable json Enco
  • Linux 安装软件 常见问题 x86 or x64

    Linux 安装软件 常见问题 x86 or x64 平民资料 x64 是指CPU是64位版本的 x86 是指CPU是32位版本的 如果你的CPU是64位的 可以安装64位的 也可以安装32位的 反过来只能安装32位的 RedHat Lin
  • React 路由基本使用

    代码示例 有Logint和Layout组件 import React from react import BrowserRouter as Router Redirect Route Switch from react router dom
  • python重命名文件excel,在excel电子表格的文件夹python上重命名多个文件

    I am pretty new at Python and I want to automate a process that takes a lot of my time but now I need to rename about 20
  • js 如何判断属性,包括多级对象的状况

    js目前没有一个明确的方法去判断对象是否存在 尤其是出现多级属性 对象 的情况 一旦一个不存在的属性跨级取 就会报错 undefined 因此考虑封装一个通用的方法去专门检测 如果存在属性返回true 反之返回falsefunction c
  • # HTB-Tier2- Oopsie

    HTB Tier2 Oopsie Tags PHP Web Custom Applications Session Handling Apache Penetration Tester Level 1 Reconaisance Web Si

随机推荐

  • 在 uni-app 中选中奇偶子元素

    问题描述 在 uni app 中 使用 nth child 选择器选择奇偶子元素不像预期那样生效 原代码 nth child 2n 选择偶数个子元素 nth child 2n 1 选择奇数个子元素 奇数子元素 issueData item
  • redux的理解及其工作原理?工作流程?

    理解 redux是一个用于管理JavaScript应用程序状态的可预测状态容器 它是一个独立于任何特定UI库的状态管理库 但在React应用中广泛使用 工作原理可以概括为一下几个关键概念 1 store 存储 redux应用的状态 Stat
  • 调试笔记之雨过天晴多点还原软件MBR实例

    BY SUDAMI 为了能够调试多点还原软件 雨过天晴 的启动代码 目前有2种方式 引用 1 在Bochs调试器上装Windows XP系统 然后用Bochs单步调试 不过光安装操作系统就得花20个小时以上 2 用Wnhex克隆整个磁盘 配
  • 求点集中存在的点,满足:其x、y坐标值不同时小于点集中任意一点的x、y坐标值

    问题描述 对于平面上的两个点p1 x1 y1 和p2 x2 y2 如果x1 lt x2且y1 lt y2 则p2支配p1 给定平面上的n个点 请设计算法求其中没有被任何其他点支配的点 换句话说 即 求点集中存在的点 满足 其x y坐标值不同
  • Java实现杨辉三角

    杨辉三角的模型 分析 1 最外层的数字始终是 1 2 每个数等于它上方两数之和 public class Yanghui public static void main String args int yanghui new int 10
  • springcloud配合eureka遇到的巨坑

    springcloud配合eureka遇到一个巨坑 这个问题困扰了楼主整整3天 问题描述 项目在idea能够启动 注册服务 心跳检测一切正常 但是打包后放入服务器中 发现项目启动正常 服务注册正常 但是过了30秒后 eureka开始报错 报
  • [JSP暑假实训] 五.MyEclipse+Servlet+JSP实现火车票网站注册操作及登陆验证

    本系列文章是作者暑假给学生进行实训分享的笔记 主要介绍MyEclipse环境下JSP网站开发 包括JAVA基础 网页布局 数据库基础 Servlet 前端后台数据库交互 DAO等知识 前一篇文章讲解了MyEclipse Servlet JS
  • 用户管理相关命令

    用户管理相关命令 实验目的 通过对用户管理相关命令进行练习 能够对linux中用户和组的维护和管理工作熟练处理 实验内容 1 su命令 切换另一用户 切换主用户时需要输入密码 2 用户相关命令 useradd 创建新用户 passwd us
  • android 检查otg,怎么查看手机是否支持otg

    怎么查看手机是否支持otg很多同学都遇到了这个问题 那么该如何解决呢 请看IEfans小编给大家带来的查看手机是否支持otg方法一览 希望对您有所帮助 工具 原料 手机 VIVO X6S A 系统 PD1415BA A 3 13 10And
  • LeetCode141:环形链表

    给你一个链表的头节点 head 判断链表中是否有环 如果链表中有某个节点 可以通过连续跟踪 next 指针再次到达 则链表中存在环 为了表示给定链表中的环 评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置 索引从 0 开始 注意
  • Non-resolvable parent POM for解决

    在运行maven项目是出现CIA列错误提示 INFO Scanning for projects ERROR ERROR Some problems were encountered while processing the POMs FA
  • 机器学习资源大全中文版

    中午版翻译转载自 https github com jobbole awesome machine learning cn 英文版原文转载自 https github com josephmisiti awesome machine lea
  • Jeesite 登录逻辑分析

    最近项目需求研究免登录进入jeesite系统 于是对jeesite的登录逻辑进行了研究 一 当用户从url访问jeesite系统时 首先会通过下面方法 RequestMapping value adminPath login method
  • ag-grid-vue单元格合并

    原理 调用ag的合并方法时 会先找到第一个需要合并的单元格 然后设置z index 1 继续往下找 如果第二行该列仍然需要合并 则第一行刚才找到的单元格的高度会乘以2 以此类推 如果连续找到第9个依然需要合并 则 第一个找到的单元的高度 1
  • 朴素贝叶斯分类器之天气预测算法

    朴素贝叶斯分类器之天气预测算法 1 1 题目的主要研究内容 1 根据天气情况预测要不要去打网球 1 2 题目研究的工作基础或实验条件 1 硬件环境 Intel R Core TM i7 7700HQ CPU 2 软件环境 本实验的软件环境主
  • 24进制 编码实现

    coding utf8 ALPHABET abcdefghijkmnpqrstuvwxyz ALPH VALUE a 0 b 1 c 2 d 3 e 4 f 5 g 6 h 7 i 8 j 9 k 10 m 11 n 12 p 13 q 1
  • 数据库模糊查询

    模糊查询 like 通配符 代表单个任意字符 代表任意个数字符 1 查询姓 马 的学员信息 select from stu where name like 马 2 查询第二个字是 花 的学员信息 select from stu where
  • [技术发展-2]:高级研修班-软件与信息服务篇-《国际电子信息产业创新的经验及借鉴》

    作者主页 https blog csdn net HiWangWenBin 文章出处 https blog csdn net HiWangWenBing article details 117374830 目录 前言 第1章 电子信息产业发
  • C语言——库函数qsort的使用和模拟实现

    作者 敲代码 流川枫 博客主页 流川枫的博客 专栏 C语言从入门到进阶 语录 Stay hungry stay foolish 工欲善其事必先利其器 给大家介绍一款超牛的斩获大厂offer利器 牛客网 点击免费注册和我一起刷题吧 文章目录
  • Windows10中搭建ftp服务器以实现文件传输

    开启ftp服务 1 打开控制面板 程序和功能 启用或关闭Windows功能 2 找到Internet Information Services 开启以下服务 勾选之后 ftp服务开启成功 配置IIS 搭建ftp 1 Win S键搜索iis