⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftpconnection.java

📁 Ftp服务1.0
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
      * <code>RNFR &lt;SP&gt; &lt;pathname&gt; &lt;CRLF&gt;</code><br>
      *
      * This command specifies the old pathname of the file which is
      * to be renamed.  This command must be immediately followed by
      * a "rename to" command specifying the new file pathname.
      */
     public void doRNFR(FtpRequest request, FtpWriter out) throws IOException {
         
         // reset state variable
         resetState();
         
         // argument check
         if(!request.hasArgument()) {
            out.write(mFtpStatus.getResponse(501, request, mUser, null));
            return;  
         }
         
         // set state variable
         mbRenFr = true;
         
         // get filenames
         String fileName = request.getArgument();
         fileName = mUser.getVirtualDirectory().getAbsoluteName(fileName);
         mstRenFr = mUser.getVirtualDirectory().getPhysicalName(fileName);
         String args[] = {fileName};
         
         out.write(mFtpStatus.getResponse(350, request, mUser, args));
     }
     
     
     /**
      * <code>RNTO &lt;SP&gt; &lt;pathname&gt; &lt;CRLF&gt;</code><br>
      *
      * This command specifies the new pathname of the file
      * specified in the immediately preceding "rename from"
      * command.  Together the two commands cause a file to be
      * renamed.
      */
     public void doRNTO(FtpRequest request, FtpWriter out) throws IOException {
         
         // argument check
         if(!request.hasArgument()) {
            resetState(); 
            out.write(mFtpStatus.getResponse(501, request, mUser, null));
            return;  
         }
         
         // set state variables
         if((!mbRenFr) || (mstRenFr == null)) {
              resetState();
              out.write(mFtpStatus.getResponse(100, request, mUser, null));
              return;
         }
         
         // get filenames
         String fromFileStr = mUser.getVirtualDirectory().getVirtualName(mstRenFr);
         String toFileStr = request.getArgument();
         toFileStr = mUser.getVirtualDirectory().getAbsoluteName(toFileStr);
         String physicalToFileStr = mUser.getVirtualDirectory().getPhysicalName(toFileStr);
         File fromFile = new File(mstRenFr);
         File toFile = new File(physicalToFileStr);
         String args[] = {fromFileStr, toFileStr};
         
         resetState();
         
         // check permission
         if(!mUser.getVirtualDirectory().hasCreatePermission(physicalToFileStr, true)) {
            out.write(mFtpStatus.getResponse(553, request, mUser, null));
            return;
         }
         
         // now rename
         if(fromFile.renameTo(toFile)) {
             out.write(mFtpStatus.getResponse(250, request, mUser, args));
         }
         else {
             out.write(mFtpStatus.getResponse(553, request, mUser, args));
         }
     } 
     
     
     /**
      * <code>SITE &lt;SP&gt; <string> &lt;CRLF&gt;</code><br>
      *
      * This command is used by the server to provide services
      * specific to his system that are essential to file transfer
      * but not sufficiently universal to be included as commands in
      * the protocol.
      */
     public void doSITE(FtpRequest request, FtpWriter out) throws IOException {
         SiteCommandHandler siteCmd = new SiteCommandHandler( mConfig, mUser );
         out.write( siteCmd.getResponse(request) );
     }
     
     
     /**
      * <code>SIZE &lt;SP&gt; &lt;pathname&gt; &lt;CRLF&gt;</code><br>
      *
      * Returns the size of the file in bytes.
      */
     public void doSIZE(FtpRequest request, FtpWriter out) throws IOException {
         
         // argument check
         if(!request.hasArgument()) {
            out.write(mFtpStatus.getResponse(501, request, mUser, null));
            return;  
         }
        
         // reset state variables
         resetState();
        
         // get filenames
         String fileName = request.getArgument();
         fileName = mUser.getVirtualDirectory().getAbsoluteName(fileName);
         String physicalName = mUser.getVirtualDirectory().getPhysicalName(fileName);
         File reqFile = new File(physicalName);
         
         // print file size
         if(reqFile.exists()) {
             String args[] = {String.valueOf(reqFile.length())};             
             out.write(mFtpStatus.getResponse(213, request, mUser, args));
         }
         else {
             out.write(mFtpStatus.getResponse(550, request, mUser, null));
         }
     } 
     
     
     /**
      * <code>STAT [&lt;SP&gt; &lt;pathname&gt;] &lt;CRLF&gt;</code><br>
      *
      * This command shall cause a status response to be sent over
      * the control connection in the form of a reply.
      */
     public void doSTAT(FtpRequest request, FtpWriter out) throws IOException {
         String args[] = {
            mConfig.getSelfAddress().getHostAddress(),
            mControlSocket.getInetAddress().getHostAddress(),
            mUser.getName()
         };
       
         out.write(mFtpStatus.getResponse(211, request, mUser, args)); 
     } 
     
     
     /**
      * <code>STOR &lt;SP&gt; &lt;pathname&gt; &lt;CRLF&gt;</code><br>
      *
      * This command causes the server-DTP to accept the data
      * transferred via the data connection and to store the data as
      * a file at the server site.  If the file specified in the
      * pathname exists at the server site, then its contents shall
      * be replaced by the data being transferred.  A new file is
      * created at the server site if the file specified in the
      * pathname does not already exist.
      */
     public void doSTOR(FtpRequest request, FtpWriter out) throws IOException {
         
         // set state variables
         long skipLen = (mbReset) ? mlSkipLen : 0;
         resetState();
         
         // argument check
         if(!request.hasArgument()) {
            out.write(mFtpStatus.getResponse(501, request, mUser, null));
            return;  
         }
         
         // get filenames
         String fileName = request.getArgument();
         fileName = mUser.getVirtualDirectory().getAbsoluteName(fileName);
         String physicalName = mUser.getVirtualDirectory().getPhysicalName(fileName);
         File requestedFile = new File(physicalName);
         
         // get permission
         if(!mUser.getVirtualDirectory().hasCreatePermission(physicalName, true)) {
             out.write(mFtpStatus.getResponse(550, request, mUser, null));
             return;
         }
         
         // now transfer file data
         out.write(mFtpStatus.getResponse(150, request, mUser, null));
         InputStream is = null;
         OutputStream os = null;
         try {
             Socket dataSoc = mDataConnection.getDataSocket();
             if (dataSoc == null) {
                  out.write(mFtpStatus.getResponse(550, request, mUser, null));
                  return;
             }
             
             is = dataSoc.getInputStream();
             
             RandomAccessFile raf = new RandomAccessFile(requestedFile, "rw");
             raf.seek(skipLen);
             os = mUser.getOutputStream( new FileOutputStream(raf.getFD()) );
             
             StreamConnector msc = new StreamConnector(is, os);
             msc.setMaxTransferRate(mUser.getMaxUploadRate());
             msc.setObserver(this);
             msc.connect();
             
             if(msc.hasException()) {
                 out.write(mFtpStatus.getResponse(451, request, mUser, null));
                 return;
             }
             else {
                 mConfig.getStatistics().setUpload(requestedFile, mUser, msc.getTransferredSize());
             }
             
             out.write(mFtpStatus.getResponse(226, request, mUser, null));
         }
         catch(IOException ex) {
             out.write(mFtpStatus.getResponse(425, request, mUser, null));
         }
         finally {
             IoUtils.close(is);
             IoUtils.close(os);
             mDataConnection.reset();
         }
     }
     
     
     /**
      * <code>STOU &lt;CRLF&gt;</code><br>
      *
      * This command behaves like STOR except that the resultant
      * file is to be created in the current directory under a name
      * unique to that directory.  The 250 Transfer Started response
      * must include the name generated.
      */
     public void doSTOU(FtpRequest request, FtpWriter out) throws IOException {
         
         // reset state variables
         resetState();
         
         // get filenames
         String fileName = mUser.getVirtualDirectory().getAbsoluteName("ftp.dat");
         String physicalName = mUser.getVirtualDirectory().getPhysicalName(fileName);
         File requestedFile = new File(physicalName);
         requestedFile = IoUtils.getUniqueFile(requestedFile);
         fileName = mUser.getVirtualDirectory().getVirtualName(requestedFile.getAbsolutePath());
         String args[] = {fileName};
         
         // check permission
         if(!mUser.getVirtualDirectory().hasCreatePermission(fileName, false)) {
             out.write(mFtpStatus.getResponse(550, request, mUser, null));
             return;
         }
         
         // now transfer file data
         out.write(mFtpStatus.getResponse(150, request, mUser, null));
         InputStream is = null;
         OutputStream os = null;
         try {
             Socket dataSoc = mDataConnection.getDataSocket();
             if (dataSoc == null) {
                  out.write(mFtpStatus.getResponse(550, request, mUser, args));
                  return;
             }

             
             is = dataSoc.getInputStream();
             os = mUser.getOutputStream( new FileOutputStream(requestedFile) );
             
             StreamConnector msc = new StreamConnector(is, os);
             msc.setMaxTransferRate(mUser.getMaxUploadRate());
             msc.setObserver(this);
             msc.connect();
             
             if(msc.hasException()) {
                 out.write(mFtpStatus.getResponse(451, request, mUser, null));
                 return;
             }
             else {
                 mConfig.getStatistics().setUpload(requestedFile, mUser, msc.getTransferredSize());
             }
             
             out.write(mFtpStatus.getResponse(226, request, mUser, null));
             mDataConnection.reset();
             out.write(mFtpStatus.getResponse(250, request, mUser, args));
         }
         catch(IOException ex) {
             out.write(mFtpStatus.getResponse(425, request, mUser, null));
         }
         finally {
            IoUtils.close(is);
            IoUtils.close(os);
            mDataConnection.reset(); 
         }
     }
     
     
     /**
      * <code>STRU &lt;SP&gt; &lt;structure-code&gt; &lt;CRLF&gt;</code><br>
      *
      * The argument is a single Telnet character code specifying
      * file structure.
      */
     public void doSTRU(FtpRequest request, FtpWriter out) throws IOException {
         
         // reset state variables
         resetState();
         
         // argument check
         if(!request.hasArgument()) {
            out.write(mFtpStatus.getResponse(501, request, mUser, null));
            return;  
         }
         
         if (mUser.setStructure(request.getArgument().charAt(0))) {
            out.write(mFtpStatus.getResponse(200, request, mUser, null));
         }
         else {
             out.write(mFtpStatus.getResponse(504, request, mUser, null));
         }
     }
     
     
     /**
      * <code>SYST &lt;CRLF&gt;</code><br> 
      *
      * This command is used to find out the type of operating
      * system at the server.
      */
     public void doSYST(FtpRequest request, FtpWriter out) throws IOException {
         
         // reset state variables
         resetState();
         
         String args[] = {mConfig.getSystemName()};
         out.write(mFtpStatus.getResponse(215, request, mUser, args));
     }
     
     
     /**
      * <code>TYPE &lt;SP&gt; &lt;type-code&gt; &lt;CRLF&gt;</code><br>
      *
      * The argument specifies the representation type.
      */
     public void doTYPE(FtpRequest request, FtpWriter out) throws IOException {
         
         // reset state variables
         resetState();
         
         // get type from argument
         char type = 'A';
         if (request.hasArgument()){
             type = request.getArgument().charAt(0);
         }
         
         // set it
         if (mUser.setType(type)) {
            out.write(mFtpStatus.getResponse(200, request, mUser, null));
         }
         else {
             out.write(mFtpStatus.getResponse(504, request, mUser, null));
         }
     }
     
     
     /**
      * <code>USER &lt;SP&gt; &lt;username&gt; &lt;CRLF&gt;</code><br>
      *
      * The argument field is a Telnet string identifying the user.
      * The user identification is that which is required by the
      * server for access to its file system.  This command will
      * normally be the first command transmitted by the user after
      * the control connections are made.
      */
     public void doUSER(FtpRequest request, FtpWriter out) throws IOException {
         
         // set state variables
         resetState();
         
         // argument check
         if(!request.hasArgument()) {
            out.write(mFtpStatus.getResponse(501, request, mUser, null));
            return;  
         }         
         
         // check user login status
         mbUser = true;
         if(mUser.hasLoggedIn()) {
             if(mUser.getName().equals(request.getArgument())) {
                 out.write(mFtpStatus.getResponse(230, request, mUser, null));
                 return;
             }
             else {
                 mConfig.getConnectionService().closeConnection(mUser.getSessionId());
             }
         }

         // set user name and send appropriate message
         mUser.setName(request.getArgument());
         if(mUser.getIsAnonymous()) {
             if(mConfig.isAnonymousLoginAllowed()) { 
                 FtpRequest anoRequest = new FtpRequest(mUser.getName());
                 out.write(mFtpStatus.getResponse(331, anoRequest, mUser, null));
             }
             else {
                 out.write(mFtpStatus.getResponse(530, request, mUser, null));
                 ConnectionService conService = mConfig.getConnectionService();
                 if (conService != null) {
                    conService.closeConnection(mUser.getSessionId());
                 }
             }
         }
         else {
             out.write(mFtpStatus.getResponse(331, request, mUser, null));
         }
     }
     
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -