gpt4 book ai didi

Java apache FTPServer 和 common.net FTPClient

转载 作者:搜寻专家 更新时间:2023-11-01 03:28:40 27 4
gpt4 key购买 nike

我正在尝试在 java FTPServer 上上传文件。

文件传输正常,但所有上传的文件都多了一个6ko数据。

我使用嵌入式方法在应用程序所需的 EJB 服务 bean 中启动 FTPServer

这是我使用的代码:

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

我真的不明白为什么传输数据大小错误。

服务器的跟踪日志也没有错误。

11:52:28,548 信息 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] 已创建11:52:28,549 信息 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] 已打开11:52:28,550 信息 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] SENT:220 服务已为新用户准备就绪。

11:52:28,552 信息 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] 收到:USER jboss11:52:28,553 INFO [org.apache.ftpserver.listener.nio.FtpLoggingFilter] SENT: 331 用户名可以,jboss 需要密码。

11:52:28,553 信息 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] 已收到:通过 *11:52:28,561 INFO [org.apache.ftpserver.command.impl.PASS] 登录成功-jboss11:52:28,561 信息 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] SENT:230 用户登录,继续。

11:52:28,562 信息 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] 已收到:端口 127,0,0,1,12,19011:52:28,563 信息 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] 发送:200 命令端口正常。

11:52:28,563 信息 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] 收到:STOR bug sheep 2.png11:52:28,705 INFO [org.apache.ftpserver.command.impl.STOR] 文件上传/bug sheep 2.png11:52:28,706 信息 [org.apache.ftpserver.listener.nio.FtpLoggingFilter] 发送:150 文件状态正常;即将打开数据连接。

11:52:28,706 INFO [org.apache.ftpserver.listener.nio.FtpLoggingFilter] SENT:226 传输完成。

谢谢你的帮助

最佳答案

我找到了解决方案。我必须手动将传输类型设置为二进制模式。

ftp.setFileType(FTP.BINARY_FILE_TYPE);

关于Java apache FTPServer 和 common.net FTPClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6562206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com