Ftp站点设置详细介绍(附上java上传下载源代码)

一、安装FTP组件

    由于Win7默认没有安装FTP组件。故FTP的设置第一步就是安装FTP组件

    点击:控制面板—》程序和功能—》打开或关闭Windows功能。勾选“FTP服务器”及“FTP服务”“FTP扩展性”,点击“确定”,安装FTP组件。如下图所示

    

  二、添加FTP站点

    点击:控制面板—》管理工具。选中“Internet信息服务(IIS)管理器”,如图

    

    双击“Internet信息服务(IIS)管理器”。弹出管理器界面,如下图所示:

    

    单击选中“网站”,并且在其上右击,选择“添加FTP站点”,出现“站点信息”界面,如下所示:

    

    给FTP取名(本例是:zhu),以及设置FTP站点的物理路径(本例是:c:\ftp),点击“下一步”,出现“绑定和SSL设置”界面,如下图所示

    

    IP设置为本机的IP地址,端口用FTP默认的21,SSL勾选“无”。点击“下一步”,出现“身份验证和授权信息”界面,如下图所示:

    

    如果只是想设置简单的FTP,则“身份验证”和“授权”都勾选“匿名”,并且给匿名设置相应的权限。本例中,还要给FTP配置帐号,以及帐号的权限,故“身份验证”勾选“基本”,“授权”勾选“未选定”,点击“完成”,完成FTP站点的设置。

  三、设置FTP帐号以及权限

    由于Win7下的FTP帐号是Windows用户帐号。所以,先得添加两个用户帐号,一个是View,可以浏览、下载FTP内容;一个是Admin,完全控制FTP。

    点击:控制面板—》管理工具—》计算机管理。在计算机管理的界面的左侧,点击:系统工具—》本地用户和组—》用户,右侧显示所有用户。如下图所示:

    

    在“用户”上右击,出现“新用户”,如下所示:

    

    在用户名中输入View,设置好密码,去掉勾选“用户下次登陆时须更改密码”,勾选“用户不能更改密码”和“密码永不过期”。点击“创建”,完成用户View的创建。同样的步骤,创建Admin用户。由于Windows默认将用户添加到Users组,你可以将刚才的两个用户从Users组中删除。方法是在“计算机管理”中点击“组”,在右侧的列表中找到Users,双击之,出现如下界面,点中用户View,点“删除”,点中用户Admin,点“删除”。将两个用户从Users组中删除。

    

    接下来,在FTP站点中,给View和Admin添加权限。

    点击:控制面板—》管理工具—》Internet信息服务(IIS)管理器。点中刚才新建的FTP站点。点中“FTP授权规则”。如下图所示:

    

    点击右侧的“编辑权限”,对FTP站点文件夹添加用户权限。在弹出的窗口中,点击“安全”标签。,如下图所示:

    

    点“编辑”,出现权限的窗口,如下:

    

    点“添加”,在“输入对象名称来选择”中输入View,点“确定”,添加View用户。如下所示:

    

    添加的View用户,默认是只有读取、列出的权限。在依法添加Admin用户,给Admin用户添加完全控制的权限。如下所示:

    

    再回到“Internet信息服务(IIS)管理器”窗口,双击刚才选中的“FTP授权规则”,在FTP站点中对View和Admin授权。如下所示:

    

    点击右侧的“添加允许规则”,在弹出的窗口中,勾选“指定的用户”,输入View,在下方的“权限”中,勾选“读取”。如下所示:

    

    点“确定”,给FTP站点添加View用户,相应的权限是读取。再给FTP站点添加Admin用户,相应的权限是读取和写入。

    至此,FTP的站点设置就完成了。站点文件夹是c:\ftp,View用户有读取(浏览和下载)的权限,Admin用户有读取和写入(上传和删除)的权限。当然,还可以根据实际的情况添加用户及相应的权限,也可以将用户添加进组,再给组设置权限。还可以添加匿名用户等等,不一而足了。

    然而,事情远远没有结束。如果,你急于做测试的话。会发现,在本机上测试正常,但是用别的机器测试FTP的话,会发现连接不上。问题出在Win7下的防火墙。如果你把防火墙关掉,你会发现FTP恢复了正常,但你也不能因为要用FTP,就把Win7的防火墙关掉。要想在Win7开着防火墙的时候还要正常使用,还必须得在防火墙中进行一番设置

  四、Win7的防火墙设置

    点击:控制面板—》Windows防火墙。点击左侧的“允许程序或功能通过Windows防火墙”,选中“FTP服务器”,将后面的两个框都勾选,如下所示:

    

    这是网上绝大多数介绍的防火墙设置。然而还不够,你做测试的话会发现,还是连接不上。还必须在防火墙中进一步做设置。

    点击下方的“允许运行另一程序”,在弹出窗口里,点“浏览”,找到C:\Windows\System32\inetsrv\inetinfo.exe,点添加,也就是上图中的Internet Infomation Services。将后面的两个框也都选中。因为在Win7下,FTP是IIS的一个组件,因此也必须在防火墙中将IIS设置为允许。而IIS又不在默认的列表中,因此得手动添加。

    遗憾的是,这样设置,FTP还是不能正常使用。由于FTP用的是21端口,因此在防火墙中还得添加出站和入站的端口规则。

    在Windows防火墙窗口里,点击左侧的“高级设置”,弹出高级安全防火墙窗口,点击左侧的“入站规则”,如下图所示:

    

    点击右侧的“新建规则”,出现向导界面,勾选“端口”,如图:

    

    点击“下一步”,勾选TCP(FTP用的是TCP协议),再勾选特定本地端口,输入21(FTP用的是21端口)如图所示:

    

    点击“下一步”,勾选“允许连接”,如图:

    

    点击“下一步”,默认的都选上,如图:

    

    点击“下一步”,在名称里输入名字,本例中是21,如图

    

    点击“完成”,完成入站规则的设置,在用同样的方法,完成出站规则的设置,同样是21端口。

    至此,在Win7的防火墙就已经设置好了。现在测试基本上就正常了。

 

  不过,还有个小问题:

  在用IE浏览FTP的时候,虽然可以登录,但是没法显示FTP内容。这个是IE的设置问题。在Internet选项中,将“使用被动FTP(用于防火墙和DSL调制解调器的兼容性)”勾掉就解决了不能浏览的问题。如下图所示:

  

 

  设置OK之后,附上java使用FTP上传文件的demo源代码。

 

 

{CSDN:CODE:

package com.grg;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public class ContinueFTP {
  private FTPClient ftpClient = new FTPClient(); 
 
  public ContinueFTP(){       //设置将过程中使用到的命令输出到控制台          
   this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
  } 
 
  public boolean connect(String hostname,int port,String username,String password) throws IOException{      
   ftpClient.connect(hostname, port);      
   if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){        
    if(ftpClient.login(username, password)){          
     return true;        
     }      
    }      
   disconnect();      
   return false;    
   } 
 
  public boolean download(String remote,String local) throws IOException{      
   ftpClient.enterLocalPassiveMode();      
   ftpClient.setFileType(FTP.BINARY_FILE_TYPE);      
   boolean result;      
   File f = new File(local);     
   FTPFile[] files = ftpClient.listFiles(remote);      
   if(files.length != 1){        
    System.out.println("远程文件不唯一");        
    return false;     
    }      
   long lRemoteSize = files[0].getSize();      
   if(f.exists()){        
    OutputStream out = new FileOutputStream(f,true);        
    System.out.println("本地文件大小为:"+f.length());        
    if(f.length() >= lRemoteSize){          
     System.out.println("本地文件大小大于远程文件大小,下载中止");          
     return false;        
     }        
    ftpClient.setRestartOffset(f.length());       
    result = ftpClient.retrieveFile(remote, out);        
    out.close();      
    }else {        
     OutputStream out = new FileOutputStream(f);       
     result = ftpClient.retrieveFile(remote, out);        
     out.close();      
     }      
    return result;   
   }
 
  public String upload(String local,String remote) throws IOException{       //设置PassiveMode传输      
   ftpClient.enterLocalPassiveMode();         //设置以二进制流的方式传输      
   ftpClient.setFileType(FTP.BINARY_FILE_TYPE);      
   String result;             //对远程目录的处理     
   String remoteFileName = remote;      
   if(remote.contains("/")){       
    remoteFileName = remote.substring(remote.lastIndexOf("/")+1);       
    String directory = remote.substring(0,remote.lastIndexOf("/")+1);        
    if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(directory)){           //如果远程目录不存在,则递归创建远程服务器目录        
     int start=0;         
     int end = 0;          
     if(directory.startsWith("/")){            
      start = 1;          
      }else{           
       start = 0;         
       }          
     end = directory.indexOf("/",start);          
     while(true){       
      String subDirectory = remote.substring(start,end);          
      if(!ftpClient.changeWorkingDirectory(subDirectory)){             
       if(ftpClient.makeDirectory(subDirectory)){               
        ftpClient.changeWorkingDirectory(subDirectory);             
        }else {               
         System.out.println("创建目录失败");               
         return "创建目录失败";            
         }            
       }            
      start = end + 1;            
      end = directory.indexOf("/",start);             //检查所有目录是否创建完毕          
      if(end <= start){          
       break;        
       }     
      }      
     }    
    }        
  
   //检查远程是否存在文件  
   FTPFile[] files = ftpClient.listFiles(remoteFileName);     
   if(files.length == 1){       
    long remoteSize = files[0].getSize();       
    File f = new File(local);        
    long localSize = f.length();        
    if(remoteSize==localSize){          
     return "文件存在";       
      }else if(remoteSize > localSize){          
    // return UploadStatus.Remote_Bigger_Local;     
       return "UploadStatus.Remote_Bigger_Local";
    }      
    //尝试移动文件内读取指针,实现断点续传       
    InputStream is = new FileInputStream(f);       
    if(is.skip(remoteSize)==remoteSize){         
     ftpClient.setRestartOffset(remoteSize);         
     if(ftpClient.storeFile(remote, is)){          
    //  return UploadStatus.Upload_From_Break_Success;      
      return "UploadStatus.Upload_From_Break_Success";
      }       
     }         //如果断点续传没有成功,则删除服务器上文件,重新上传       
    if(!ftpClient.deleteFile(remoteFileName)){        
    // return UploadStatus.Delete_Remote_Faild;     
     return "UploadStatus.Delete_Remote_Faild";     
     }       
    is = new FileInputStream(f);     
    if(ftpClient.storeFile(remote, is)){           
     result = "UploadStatus.Upload_New_File_Success";     
    // result = UploadStatus.Upload_New_File_Success;     
     }else{       
     // result = UploadStatus.Upload_New_File_Failed;     
      result = "UploadStatus.Upload_New_File_Failed";     
      }       
    is.close();    
  }else{     
   InputStream is = new FileInputStream(local);     
   if(ftpClient.storeFile(remoteFileName, is)){       
    result = "上传新文件成功";     
    }else{          
    result = "上传新文件失败";   
    }      
     is.close();   
    }  
  
   return result; 

  }
   
  public void disconnect() throws IOException{
   if(ftpClient.isConnected()){        
    ftpClient.disconnect();    
    }
  }
 
  public static void main(String[] args){
   ContinueFTP myFtp = new ContinueFTP(); 
   try{
    myFtp.connect("192.168.21.171", 21, "test", "test"); 
    System.out.println(myFtp.upload("E:\\VP6.flv", "/MIS/video/VP6.flv")); 
    myFtp.disconnect(); 
   }catch(Exception e){
    e.printStackTrace();
    System.out.println("连接FTP出错:"+e.getMessage()); 
   }
  
  }
}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值