文件之ftp下载文件大小为0的几种情况处理

目录

一、字符集的原因

1. 测试UTF-8
2.使用GBK

二、文件下载需要时间

三、网络连接超时

四、具体测试代码

总结


一、第一种情况。字符集的原因

首先需要搭建ftpserver端

注:这篇文章测试使用的server端是在windows搭建的
这里有[window10搭建ftp服务注意事项,也有关于完整搭建server端的文章链接》》详情可查看》》
注:若下载的ftp文件包含文件名是中文的情况。若不设置ftpclient的字符集为GBK格式,会出现在client端获取到的文件名是乱码的情况。导致无法正常下载文件.

1. 测试UTF-8

注:设置client端字符集编码是UTF-8的情况会出现乱码
注:下载后大小为0,并且文件名称还是乱码
在这里插入图片描述
异常:文件未找到在这里插入图片描述注:UTF-8与GBK的区别解释
注:下面截图是搜索AI获取的结果。总结来说就是为了更好的兼容故使用的GBK
在这里插入图片描述

2. 使用GBK

注:测试成功。将字符集改成GBK
在这里插入图片描述

二. 第二种情况。文件下载需要时间。

注:先别急着关闭流。让子弹多飞一会使用文件修改时间进行判断
注:增加对文件修改时间的判断将上次修改时间与这次时间进行比较, 若时间小于1000ms则表示正在被操作,进行等待操作完成。在这里插入图片描述
注:可参照具体代码
注:判断的位置在流关闭(out.close)之前与缓冲器输出(out.flush)之前进行。其实在out.flush前文件修改时间已经在不断变换
在这里插入图片描述

三. 第三种情况。网络连接超时。

注:网络连接超时。
在这里插入图片描述

四、具体代码

注:依赖

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.9.0</version>
</dependency>

Main方法。

package org.home;

import java.io.File;

public class Downloadfile {
    public static void main(String[] args) throws Exception {
        FtpClientConfig ftpClientConfig = new FtpClientConfig();
        ftpClientConfig.setHost("127.0.0.1");
        ftpClientConfig.setPort(21);
        ftpClientConfig.setPassword("ftpadmin");
        ftpClientConfig.setUsername("ftpadmin");
        FtpUtil ftpUtil = FtpUtil.createFtpCli(ftpClientConfig.getHost(), ftpClientConfig.getPort()
                , ftpClientConfig.getUsername(), ftpClientConfig.getPassword(), "UTF-8", ftpClientConfig.getBaseFilePath());
        ftpUtil.getFtpClientConnected();
        ftpUtil.downloadDir("/downloadfile","C:\\Users\\Administrator\\Documents");
    }
}

工具类。FtpUtil.java

package org.home;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.*;
import org.apache.commons.net.io.Util;

import java.io.*;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Data
@Slf4j
public class FtpUtil {

    /**
     * 字符集
     */
    private static final String DEFAULT_CHARSET = "UTF-8";

    /**
     * 超时时间
     */
    private static final int DEFAULT_TIMEOUT = 60 * 1000;

    /**
     * 主机名或者ip地址
     */
    private final String host;

    /**
     * ftp服务器端口
     */
    private final int port;

    /**
     * ftp用户名
     */
    private final String username;

    /**
     * ftp密码
     */
    private final String password;

    /**
     * ftpClient对象
     */
    private final FTPClient ftpClient;

    /**
     * 初始化时ftp服务器路径
     */
    private volatile String ftpBasePath;

    /**
     * 构造函数
     *
     * @param host        主机名或者ip地址
     * @param port        ftp 端口
     * @param username    用户名
     * @param password    密码
     * @param ftpBasePath 初始化时ftp服务器路径
     */
    private FtpUtil(String host, int port, String username, String password, String charset, String ftpBasePath) {
        ftpClient = new FTPClient( );
        ftpClient.setControlEncoding(charset);
        this.host = StringUtils.isEmpty(host) ? "localhost" : host;
        this.port = (port <= 0) ? 21 : port;
        this.username = StringUtils.isEmpty(username) ? "anonymous" : username;
        this.password = password;
        this.ftpBasePath = ftpBasePath;
    }

    public void getFtpClientConnected() throws Exception {
        // 处理传入路径
        try {
            this.connect();
        } catch (IOException e) {
            throw new Exception(e);
        }
        if(!this.isConnected()) {
            throw new Exception("ftp未建立连接");
        }
    }

    /**
     * 创建自定义属性的ftp客户端
     *
     * @param host        主机名或者ip地址
     * @param port        ftp端口
     * @param username    ftp用户名
     * @param password    ftp密码
     * @param charset     字符集
     * @param ftpBasePath 初始化时ftp服务器路径
     * @return ftpClient
     */
    public static FtpUtil createFtpCli(String host, int port, String username, String password,
                                       String charset, String ftpBasePath) {
        return new FtpUtil(host, port, username, password, charset, ftpBasePath);
    }

    /**
     * 连接到ftp
     */
    public void connect() throws IOException {
        try {
            ftpClient.connect(host, port);
        } catch (UnknownHostException e) {
            throw new IOException("Can't find FTP server :" + host);
        }
        int reply = ftpClient.getReplyCode( );
        if (!FTPReply.isPositiveCompletion(reply)) {
            disconnect( );
            throw new IOException("Can't connect to server :" + host);
        }
        if (!ftpClient.login(username, password)) {
            disconnect( );
            throw new IOException("Can't login to server :" + host);
        }
        // set data transfer mode.
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        // Use passive mode to pass firewalls.
        ftpClient.enterLocalPassiveMode( );
        initFtpBasePath( );
    }

    /**
     * 连接ftp时保存刚登陆ftp时的路径
     */
    private void initFtpBasePath() throws IOException {
        if (StringUtils.isEmpty(ftpBasePath)) {
            synchronized (this) {
                if (StringUtils.isEmpty(ftpBasePath)) {
                    ftpBasePath = ftpClient.printWorkingDirectory( );
                }
            }
        }
    }

    /**
     * ftp是否处于连接状态,是连接状态返回<tt>true</tt>
     *
     * @return boolean  是连接状态返回<tt>true</tt>
     */
    public boolean isConnected() {
        return ftpClient.isConnected( );
    }

    /**
     * 下载ftp文件到本地上
     *
     * @param ftpFileName ftp文件路径名称
     * @param localFile   本地文件路径名称
     */
    public void download(String ftpFileName, File localFile) throws IOException {
        try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(localFile.toPath( )))) {
            FTPFile[] fileInfoArray = ftpClient.listFiles(ftpFileName);
            if (fileInfoArray == null || fileInfoArray.length == 0) {
                throw new FileNotFoundException("File " + ftpFileName + " was not found on FTP server.");
            }
            FTPFile fileInfo = fileInfoArray[0];
            if (fileInfo.getSize( ) > Integer.MAX_VALUE) {
                throw new IOException("File " + ftpFileName + " is too large.");
            }
            if (!ftpClient.retrieveFile(ftpFileName, out)) {
                throw new IOException("Error loading file " + ftpFileName + " from FTP server. Check FTP permissions and path.");
            }
            boolean flag = isFileBeingWritten(localFile);
            log.info("文件正在被写入? {}, filepath: {}", flag, localFile.getAbsolutePath());
            while(flag) {
                flag = isFileBeingWritten(localFile);
            }
            out.flush();
            closeStream(out);
        }
    }

    private static boolean isFileBeingWritten(File file) {
        if (file.exists() && file.isFile()) {
            long lastModified = file.lastModified();
            long currentTime = System.currentTimeMillis();
            // 时间差小于 1 秒代表文件正在被操作
            return (currentTime - lastModified) < 1000;
        }
        return false;
    }

    /**
     * 下载ftp服务器下文件夹到本地
     *
     * @param remotePath ftp上文件夹路径名称
     * @param localPath  本地上传的文件夹路径名称
     */
    public void downloadDir(String remotePath, String localPath) throws Exception {
        localPath = localPath.replace("\\", "/");
        File file = new File(localPath);
        if (!file.exists( )) {
            boolean mkdirs = file.mkdirs( );
            if (!mkdirs) {
                return;
            }
        }
        FTPFile[] ftpFiles;
        try{
            ftpFiles = ftpClient.listFiles(remotePath);
        } catch (Throwable e){
            throw new Exception(e);
        }
        log.info("ftpfiles.length: {}", ftpFiles.length);
        for (int i = 0; ftpFiles != null && i < ftpFiles.length; i++) {
            FTPFile ftpFile = ftpFiles[i];
            try{
                if (ftpFile.isDirectory( ) && !".".equals(ftpFile.getName( )) && !"..".equals(ftpFile.getName( ))) {
                    downloadDir(remotePath + "/" + ftpFile.getName( ), localPath + "/" + ftpFile.getName( ));
                } else {
                    File localFile = new File(localPath + "/" + ftpFile.getName());
                    download(remotePath + "/" + ftpFile.getName( ), localFile);
                }
            }catch (Throwable e) {
                e.printStackTrace();
                throw new Exception(e);
            }
        }
    }

    /**
     * 关闭流
     *
     * @param stream 流
     */
    private static void closeStream(Closeable stream) {
        if (stream != null) {
            try {
                stream.close( );
            } catch (IOException ex) {
                log.error("关闭流出错{}", ex.getMessage( ));
            }
        }
    }

    /**
     * 关闭ftp连接
     */
    public void disconnect() {
        if (null != ftpClient && ftpClient.isConnected( )) {
            try {
                ftpClient.logout( );
                ftpClient.disconnect( );
            } catch (IOException ex) {
                log.error("关闭ftp连接出错{}", ex.getMessage( ));
            }
        }
    }
}

配置类。FtpClientConfig.java

package org.home;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Data
public class FtpClientConfig {

    private String username;

    private String password;

    private String host;

    private int port;

    private String baseFilePath;
}

总结

1. 多一些自省吾身

注:在调试程序过程中一直有一种感觉,就觉得是ftp服务器源头文件大小就是0。于是经过验证,不得不承认是自身程序代码和网络原因导致的问题
注:配置和网络原因导致。其实导致下载文件为0的情况就是数据走错了路(字符集错误,没有下载到对应的文件)和数据无路可走(网络异常)最终没有到达该去的地方。

2. 提升程序的健壮性

注:生产环境的不确定性因素很多。如网络、系统等不可控因素。所以通过健壮自身程序,多增加必要的应对对措施,提升程序运行的稳定性会更好
注:健壮性建议①重试机制(下载失败,重新下载)②日志记录(为重新下载打下基础)
注:③也是这次这篇文章关键点,也是很细节的地方。文件的传输和存储以及系统缓冲区在文件系统中的不太深刻的理解是导致这次文件下载失败问题的主要原因。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
点量Http、FTP多线程断点续传下载组件(下载DLL)的开发目的是让用户可以无需关心Http/FTP协议的具体细节,只需要几十行甚至几行代码,便可以实现一个功能完善的Http/FTP下载软件。点量Http/FTP下载组件(DLL)支持多线程、断点续传、显示详细下载过程、自动查找镜像网址、支持代理传输等完善的功能。 点量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,让您完全像调用系统API一样的调用。 点量Http/FTP组件的功能简介: 标准Http和FTP下载支持:完全标准的Http和FTP协议支持,内部通过网址自动区分是Http还是FTP下载。 极速下载(2.0以后版本):超越国内绝大多数下载软件的下载速度。新版内核在2M ADSL的环境下下载,有些文件的速度可以达到1400K字节/秒以上,超过了带宽的极限。下载速度可以用极速形容。 多线程传输:可以将文件自动分块,并采用多线程下载。并可自由设置线程数目。 断点续传:点量Http/FTP有优秀的断点续传支持,每次启动自动从上次下载的位置开始,不需要重复下载。 提供详细的下载详情接口(2.0以后版本):可以看到整个下载过程的步骤,比如开启了多少线程、服务器的应答过程、错误信息等。 支持多种高级设置:设置线程数目、磁盘缓存大小、搜索镜像服务器的详细参数设置、下载文件完成后同步文件为服务器上的文件时间、下载过程中可以自定义文件临时后缀、未完成的文件设为隐藏属性。 支持磁盘缓存:点量Http/FTP下载DLL支持设置磁盘缓存,减少对磁盘的读写,并提升下载速度。 支持设置Refer:点量Http/FTP下载组件支持设置下载时的Refer,以便可以绕过一些防盗链的网站,直接下载内容。 限速功能:点量Http/FTP下载组件可方便的设置下载限速。 多种磁盘分配方式:点量Http/FTP下载组件支持预分配和边下载边分配两种磁盘方式,满足多种下载需求。 自动搜索镜像加速:点量Http/FTP内置了镜像搜索功能,在下载文件的同时,会自动搜索哪些其它网站还有这个文件,自动从其它网址下载加速。 可提供源码:支付一定的费用,便可以获得全部的点量Http/FTP下载组件的源代码,免除您的所有后顾之忧。 良好的服务:作为点量软件旗下的软件,可享受到点量软件的优秀服务,我们的服务让您如同拥有一个称心的专业员工。 点量Http/FTP 下载组件可以适用于任何Http和FTP下载的领域,让您可以在1天内完成一个完整的Http下载软件的全部功能。比如,您可以用于产品的升级、文件下载和传输等。
点量Http/Ftp下载组件简介点量Http、FTP多线程断点续传下载组件(下载DLL)的开发目的是让用户可以无需关心Http/FTP协议的具体细节,只需要几十行甚至几行代码,便可以实现一个功能完善的Http/FTP下载软件。点量Http/FTP下载组件(DLL)支持多线程、断点续传、显示详细下载过程、自动查找镜像网址、支持代理传输等完善的功能。点量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的下载动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,让您完全像调用系统API一样的调用。点量Http/FTP组件的功能简介:标准Http和FTP下载支持:完全标准的Http和FTP协议支持,内部通过网址自动区分是Http还是FTP下载。极速下载(2.0以后版本):超越国内绝大多数下载软件的下载速度。新版内核在2M ADSL的环境下下载,有些文件的速度可以达到1400K字节/秒以上,超过了带宽的极限。下载速度可以用极速形容。多线程传输:可以将文件自动分块,并采用多线程下载。并可自由设置线程数目。断点续传:点量Http/FTP有优秀的断点续传支持,每次启动自动从上次下载的位置开始,不需要重复下载。提供详细的下载详情接口(2.0以后版本):可以看到整个下载过程的步骤,比如开启了多少线程、服务器的应答过程、错误信息等。支持多种高级设置:设置线程数目、磁盘缓存大小、搜索镜像服务器的详细参数设置、下载文件完成后同步文件为服务器上的文件时间、下载过程中可以自定义文件临时后缀、未完成的文件设为隐藏属性。支持磁盘缓存:点量Http/FTP下载DLL支持设置磁盘缓存,减少对磁盘的读写,并提升下载速度。支持设置Refer:点量Http/FTP下载组件支持设置下载时的Refer,以便可以绕过一些防盗链的网站,直接下载内容。限速功能:点量Http/FTP下载组件可方便的设置下载限速。多种磁盘分配方式:点量Http/FTP下载组件支持预分配和边下载边分配两种磁盘方式,满足多种下载需求。自动搜索镜像加速:点量Http/FTP内置了镜像搜索功能,在下载文件的同时,会自动搜索哪些其它网站还有这个文件,自动从其它网址下载加速。可提供源码:支付一定的费用,便可以获得全部的点量Http/FTP下载组件的源代码,免除您的所有后顾之忧。点量Http/Ftp下载组件页面展示
木翼下载系统(MYDOWN)V4是一款专业的下载系统,它采用php书写,具有高效专业的特点。木翼下载系统是为下载型网站提供的解决方案。功能强大,简单易用,生成静态页面,支持Tag, 支持关键词搜索记录,支持可自定义扩展字段, 及其内容设定, 全面满足下载型网站的需求。 木翼下载系统(MYDOWN) 4.0 修正了几个影响正常使用的bug:2011-06-30 1.修正软件列表管理出现错误BUG. 2.修正采集管理出现错误BUG. 3.修正部分情况一键转帖页面缺少文件的BUG. 4.修正大文件上传个别情况存在的错误. 功能列表: 1.MYDOWN V4默认模板风格更换,全新制作. 2.添加下载下载权限设置:后台允许修改: “否 ”“是”的默认值(还有软件大小MB和KB等). 3.希望增加暂停下载软件的批量查询 4.栏目关键词和描述、软件关键词和描述 自定义功能增加. 5.默认软件的支持系统 希望增加 VISTA 和windows7 6.转移分类页软件页面的时候,如果要转移的页面有很多页。要花很长时间,一页一页全选。要是能一次选定所有就好了 7.首页的统计信息可以加入栏目统计 及按一定参数调用的数据统计. 8.默认友情链接在新建窗口打开 9.Google Sitemap处理进一步优化 10.软件分类/软件页面URL 功能加强 更利于SEO 11.后台管理日志记录的搜索功能. 12.增加模板函数: {nophp,\"不执行php内容\"} 13.增加模板函数:getvalue 可根据选择类型的字段值获取对应的名称. 14.后台登陆默认页增加 错误报告 最新评论数 15.允许将节点1的根目录(download)去除, 可直接生成在根目录下. 16.软件下载页 投一票 功能可放在[one] 的标签模板中, 方便位置显示调整. 17.增加关闭信息站的参数. 18.软件投一票功能 投票结果实现在页面中实时更新的功能. 19.后台管理批量管理功能的加强. 20.精简HTML静态页面的几种显示方式.(可仅选择). 21.前台下载页面显示可下载的权限组信息.(当软件有设置下载的用户组时) 22.列表动态排序页面 增加对当前选择排序方式的悬停功能(知道当前是按哪种方式排) 23.多镜像站点时上传软件同步上传到镜像点上.(需FTP模块支持) 24.增加软件上一条下一条标签. 25.Tag伪静态(可开启) 增加对SEO的优化处理. 26.添加专题时增加对\"下载专题目录名称\"进行文件or目录的判断 避免无扩展名文件的产生 27.修正表字段默认值(default) 及 创建节点时创建立默认表的信息. 28.增加手机软件下载二维码功能,可在后台开启/关闭. 29.支持目标站站点页面编码为utf-8的采集. 30.目标URL不存在或无法读取时自动跳过继续下一页面内容的采集. 31.采集完自动刷新分类统计数。 32.采集内容的替换符号修改成参数设置可自定义. 33.列表页能有列表开始范围与结束范围标签,以限定自己需要的标签。 34.列表页能限制排除自定义的不符合规则的地址。如排除含 .html 的,如排除包含网址/wenzhang/这样字符的. 35.修正生成HTML后花费时间显示错误的BUG 36.优化生成HTML页面效率,加快页面生成速度,减轻系统负载. 37.优化用户IP获取函数, 对使用代理访问的用户能获取最接近真实的IP地址. 38.文章评论增加文章页面内无刷新机制及盖楼功能. 39.增加快速推荐短标题软件/简述 定义 以及调用标签. 40.参数文件中增加开启/关闭参数: (默认)会员中心模板统一到节点1的会员中心模板. 41.改进UC接口参数设置方式, 可在后台直接进行设置. / 修改UC的config.inc.php 文件位置移至uc_client目录下. 42.更新UC接口程序至1.5.2版本的支持. 43.模板内容修改: 软件厂商主页{homepage}的调用,有内容时显示相应链接,没内容时显示\"暂无\". 44.增加多数标签的缓存参数cache. 45.游客发布/提交软件功能(后台审核). 46.增加每个节点的下载验证码开启参数 47.增加每个节点的游客发布软件开启参数 48.修正网站gzip压缩开启时 当页面内容输出内容过少时不显示的问题.(原输出内容需>2048) 49增加关于我们/广告联系/版权声明/下载帮助/等 模块页面. 模板内容可在后台编辑. 50TAG 的分隔符号 修改成可自定的.(默认为只使用\",\"做为分隔符号) 51.增加软件审核不通过时 的系统自定义预设项. 点击后即可自动添入相
FTP服务器的架设 在我们的实际网络生活中,特别是宽带网接入之后,FTP服务器作为文件的传输和共享工具得到广泛应用。FTP服务器在文件的传输上性能稳定,占用系统资源小,而且传输速度快,现在网上已经有很多的FTP服务器可供使用,而自己架设一个FTP服务器也很容易,下面介绍两种主流的FTP架构方式。 1.利用微软公司的IIS 微软的IIS功能非常强大,它除了提供WWW服务之外,还提供FTP的服务,利用它一样很容易就能架设一个功能卓越的FTP服务器。 IIS的安装前面已经讲解过,下面我们一起来看看通过设置IIS来架设FTP服务器的几个步骤。 第一步:启动IIS,并启动IIS上的FTP服务。在默认的情况下,此时你的FTP服务器已经搭建好,并且可以立即登录,但是该FTP中没有任何文件。 第二步:鼠标右击IIS中的"默认FTP站点"项,选择"属性"菜单,即可出现如图19的对话框。 第三步:选择"主目录"的标签,在FTP站点目录的"本地路径"处填上你要设置的共享文件路径。默认情况下,此处的文件夹位置为"C:\Inetpub\Ftproot",你如果临时想改变共享目录,随时都可在此处修改(如图20),以后别人登录你的FTP服务器时显示的文件列表就是在这个目录中。 第三步:在"主目录"的标签处,你还可设置FTP服务器的文件访问权限,分别有读取、写入和日志访问,安全起见,这里的写入权限一般不选,保证匿名用户不能随意对你文件进行操作。 第四步:设置登录的用户。如果你愿意提供"匿名"的访问权限,还需在"安全标签"处选择上"允许匿名连接"(如图21)。此外,你还可从Windows系统帐号中选择FTP服务器的特殊帐号,当然也可以自己任意设置用户名和密码。 第五步:在"消息"标签处,有"欢迎"、"退出"和"最大连接数"3个输入框,分别代表别人在登录、退出时FTP服务器上给出的提示信息,你可根据自己的需要设置。此外,最大连接数是设置同时连接本地FTP的最大主机台数(如图22)。 第六步:在"FTP站点"的标签处设置FTP标识,包括说明、IP地址和端口,这里一般不需要改动,按照默认选择即可(如图23)。此外,在"C:\Winnt\System32\Logfiles"目录中你还可以看到连接上你FTP的IP、时间等日志信息。 此时,利用IE或者任何一款FTP的客户端软件即可登录你架设好的FTP站点。 2.利用Serv-U 在FTP服务器的搭建中,Serv-U是目前使用比较多的工具之一。它设置简单,功能强大,而且非常稳定,总体上来说上它比IIS附带的FTP服务器略胜一筹。它适用于所有的Windows版本,是一款共享软件,可以让用户免费使用一个月。 第一步:Serv-U的下载和安装。 目前Serv-U的最高版本为4.0,文件大小为2.9MB,它的下载站点之一为"http://www.download.com.cn/show.phtml?action=detail&id=484"。 点击下载的可执行文件即可开始安装了,安装过程很简单,所有设置保持默认值就可以,按"Next"完成每一步(如图24)。安装完毕,在Windows的桌面上就出现Serv-U的图标,双击Serv-U图标,出现Serv-U主窗口,点击主界面右边窗口的"Start server"即可启动FTP服务器 。 第二步:Serv-U的配置。 在Serv-U的安装完成之后即可出现配置向导,可以通过这个向导来对它进行配置,主要步骤如下。 A.安装程序首先启动一个设置向导帮助你设置FTP服务器,点击"Next"继续。 B.系统弹出输入IP的对话框,此项需要填入你准备为此FTP服务器绑定的IP地址。除非你的计算机有多个固定的IP地址,并且你只想其中一个被FTP服务器所使用,否则,建议不管你是否有固定的IP地址,都将此项保留为空(即让系统自动侦测),点击"Next"(如图25)。 C.输入Domain name(域名)。此处填入你FTP服务器的域名。但域名由DNS解析而不是由这里决定,因此实际上你可以填入任意内容,比如像"我的个人FTP服务器"这种对此FTP进行说明的文字。 D.输入FTP访问的端口号,一般保持默认的21即可。 E.匿名用户的创建和访问目录的设定。首先向导会提示你是否要创建匿名帐号,这里选择是,如果选择不,则用户需要用户名和密码才能访问FTP服务器。接下来安装向导提示输入匿名用户的主目录(Anonymous home directory),此处按照需要来设定匿名用户访问硬盘的位置。 F.选择匿名用户是否将其限制在主目录里,如果选择是,则用户只能访问其主目录及以下的目录树;如果选择否,则可以访问其主目录的同级或更高级的目录树。从安全角度考虑,一般建议选是。 G.创建新用户和访问目录。按照向导的提示一步一步

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡斌附体

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值