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

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

    

Java ftp 文件为空 ftp java代码_System

  二、添加FTP站点

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

    

Java ftp 文件为空 ftp java代码_Windows_02

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

    

Java ftp 文件为空 ftp java代码_Java ftp 文件为空_03

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

    

Java ftp 文件为空 ftp java代码_java_04

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

    

Java ftp 文件为空 ftp java代码_Java ftp 文件为空_05

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

    

Java ftp 文件为空 ftp java代码_Windows_06

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

  三、设置FTP帐号以及权限

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

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

    

Java ftp 文件为空 ftp java代码_Windows_07

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

    

Java ftp 文件为空 ftp java代码_Windows_08

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

    

Java ftp 文件为空 ftp java代码_Java ftp 文件为空_09

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

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

    

Java ftp 文件为空 ftp java代码_Windows_10

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

    

Java ftp 文件为空 ftp java代码_System_11

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

    

Java ftp 文件为空 ftp java代码_System_11

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

    

Java ftp 文件为空 ftp java代码_java_13

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

    

Java ftp 文件为空 ftp java代码_Windows_14

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

    

Java ftp 文件为空 ftp java代码_java_15

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

    

Java ftp 文件为空 ftp java代码_Windows_16

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

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

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

  四、Win7的防火墙设置

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

    

Java ftp 文件为空 ftp java代码_java_17

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

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

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

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

    

Java ftp 文件为空 ftp java代码_java_18

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

    

Java ftp 文件为空 ftp java代码_java_19

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

    

Java ftp 文件为空 ftp java代码_java_20

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

    

Java ftp 文件为空 ftp java代码_java_21

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

    

Java ftp 文件为空 ftp java代码_Windows_22

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

    

Java ftp 文件为空 ftp java代码_System_23

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

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

 

  不过,还有个小问题:

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

  

Java ftp 文件为空 ftp java代码_Windows_24

 

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

 

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());  
    }
    
   }
 }