2011-07-03 2 views
4

자바 FTPServer에 파일을 업로드하려고합니다.자바 아파치 FTPServer 및 common.net FTPClient

파일 전송은 정상이지만 업로드 된 모든 파일에는 추가 6ko 데이터가 있습니다.

package com.cs3Drender.ftpservice; 

import java.io.File; 
import java.util.ArrayList; 
import java.util.List; 

import javax.ejb.Local; 

import org.apache.ftpserver.FtpServer; 
import org.apache.ftpserver.FtpServerFactory; 
import org.apache.ftpserver.ftplet.Authority; 
import org.apache.ftpserver.ftplet.FtpException; 
import org.apache.ftpserver.ftplet.UserManager; 
import org.apache.ftpserver.listener.ListenerFactory; 
import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory; 
import org.apache.ftpserver.usermanager.SaltedPasswordEncryptor; 
import org.apache.ftpserver.usermanager.impl.BaseUser; 
import org.apache.ftpserver.usermanager.impl.WritePermission; 
import org.jboss.ejb3.annotation.Service; 

/** 
* Session Bean implementation class FtpServerServiceLocal 
*/ 
@Service 
@Local(FtpServerServiceLocal.class) 
public class FtpServerService implements FtpServerServiceLocal 
{ 
private FtpServer server = null; 

@Override 
public void create() throws Exception 
{ 
    FtpServerFactory serverFactory = new FtpServerFactory();   
    ListenerFactory factory = new ListenerFactory(); 

    // set the port of the listener 
    factory.setPort(2221); 


    // replace the default listener 
    serverFactory.addListener("default", factory.createListener()); 

    // create new user 
    serverFactory.setUserManager(addUser("jboss", "azerty", "c:/tools")); 

    // start the server 
    server = serverFactory.createServer(); 
} 

@Override 
public void start() throws Exception 
{ 
    try { 
     server.start(); 
    } catch (FtpException e) { 
     e.printStackTrace(); 
    } 
} 

public void restart() throws Exception 
{ 
    try { 
     server.stop(); 
     server.start(); 
    } catch (FtpException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void stop() 
{ 
    try { 
     server.stop(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }  
} 

@Override 
public void destroy() { 
    stop(); 
    server = null;  
} 

public UserManager addUser(final String username, final String password, final String ftproot) 
{ 
    PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory(); 
    userManagerFactory.setFile(new File("c:/jbossusers.properties")); 
    userManagerFactory.setPasswordEncryptor(new SaltedPasswordEncryptor()); 
    UserManager um = userManagerFactory.createUserManager(); 

    BaseUser user = new BaseUser(); 
    user.setName(username); 
    user.setPassword(password); 
    user.setHomeDirectory(ftproot); 

    List<Authority> authorities = new ArrayList<Authority>(); 
     authorities.add(new WritePermission());   
    user.setAuthorities(authorities); 

    try { 
     um.save(user); 
    } catch (FtpException e) { 
     e.printStackTrace(); 
    } 
    return um; 
} 
} 

그리고 간단한 클라이언트 :

package client; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.SocketException; 
import java.util.Properties; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 

import org.apache.commons.net.ftp.FTPClient; 
import org.apache.commons.net.ftp.FTPFile; 

import com.cs3Drender.session.RenderSessionRemote; 

public class Client 
{ 
public static void main(String[] args) { 
    /* get a initial context. By default the settings in the file 
    * jndi.properties are used. 
    * You can explicitly set up properties instead of using the file. 
    */ 
    Properties properties = new Properties(); 
    properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory"); 
    properties.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces"); 
    properties.put("java.naming.provider.url","localhost"); 

    try 
    { 
     InitialContext context= new InitialContext(properties); 
     RenderSessionRemote beanRemote=(RenderSessionRemote)context.lookup("RenderSession/remote"); 
     //System.out.println(beanRemote.render("test")); 
     try { 
      FTPClient ftp = new FTPClient(); 
      ftp.connect("localhost", 2221); 
      ftp.login("jboss", "azerty"); 
      //ftp.enterLocalPassiveMode(); 
      //ftp.enterRemotePassiveMode(); 
      ftp.setAutodetectUTF8(true); 
      String filename = "bug sheep 2.png"; 
      ftp.storeFile(filename, new FileInputStream("c:/"+filename)); 


      ftp.logout(); 
      ftp.disconnect(); 
     } catch (SocketException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }   
    }catch(NamingException e){ 
     e.printStackTrace(); 
    } 
} 
} 

내가 응용 프로그램 여기

필요는 EJB 서비스 빈의 FTPServer를 시작 포함 된 방법을 사용하면 내가 사용하는 코드입니다

전송 데이터 크기가 잘못된 이유를 정확히 알지 못합니다.

또한 서버의 추적 로그에는 오류가 없습니다.

11 : 52 : 28,548 INFO [org.apache.ftpserver.listener.nio.FtpLoggingFilter] CREATED 11 : 52 : 28,549 INFO [org.apache.ftpserver.listener.nio.FtpLoggingFilter] 열림 11시 52분 : 28,550 정보 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] SENT : 220 새로운 사용자를위한 서비스 준비.

11 : 52 : 28,552 INFO [org.apache.ftpserver.listener.nio.FtpLoggingFilter]받은 : USER 보스 11 : 52 : 28,553 INFO [org.apache.ftpserver.listener.nio.FtpLoggingFilter] 보내 331 사용자 이름은 알았습니다. jboss 비밀번호가 필요합니다.

11 : 52 : 28,553 INFO [org.apache.ftpserver.listener.nio.FtpLoggingFilter]받은 : PASS * 11 : 52 : 28,561 INFO [org.apache.ftpserver.command.impl.PASS] 로그인 성공 - jboss 11 : 52 : 28,561 정보 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] 보낸 사람 : 230 로그인 한 사용자가 계속 진행합니다.

11 : 52 : 28,562 INFO [org.apache.ftpserver.listener.nio.FtpLoggingFilter]받은 : PORT 127,00112190 11 : 52 : 28,563 INFO [org.apache.ftpserver.listener .nio.FtpLoggingFilter] 보낸 : 200 명령 포트 괜찮아.

11 : 52 : 28,563 INFO [org.apache.ftpserver.listener.nio.FtpLoggingFilter]받은 : STOR 버그 양 2.png 11 : 52 : 28,705 INFO [org.apache.ftpserver.command.impl.STOR ] 파일 업로드/버프 양 2.png 11 : 52 : 28,706 정보 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] 보낸 사람 : 150 파일 상태 확인. 약 데이터 연결을 엽니 다.

11 : 52 : 28,706 정보 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] SENT : 226 전송이 완료되었습니다.

도움 주셔서 감사합니다.

답변

2

해결책을 찾았습니다. 수동으로 전송 유형을 바이너리 모드로 설정해야합니다.

ftp.setFileType(FTP.BINARY_FILE_TYPE);