上传文件到ftp服务器上出错,请高手看看

mohongweicwj 2012-08-03 10:16:00
private boolean upload(String local, String remote) throws IOException
{

boolean flag = false;
String localFile = "D:/anewfile/test.txt";
String remotefilepath = remote;
if(ftpClient.isConnected())
{


ftpClient.enterRemotePassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.changeWorkingDirectory(remotefilepath);
InputStream fis = null;
try
{
fis = new FileInputStream(localFile);
flag = ftpClient.storeFile(remotefilepath, fis);
//flag = ftpClient.storeUniqueFile(remotefilepath, fis);
fis.close();
if(flag)
{
System.out.println("上传成功!");
}else{
System.out.println("上传失败1!");
}
}catch(Exception e)
{
e.getStackTrace();
System.out.println("上传失败2!");
}
}
return flag;
}
上传文件到ftp服务器上出错,输出的是:上传失败1!,请看看是哪里出问题了?没有其他的错误提示
...全文
406 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mohongweicwj 2012-08-06
  • 打赏
  • 举报
回复
谢谢啦,我也找到原因了,是这句话的问题:ftpClient.enterRemotePassiveMode();
原来以为是要改成被动模式才能上传,结果弄错了,删掉就OK了,十分感谢
mohongweicwj 2012-08-03
  • 打赏
  • 举报
回复
是这样的,我已经登陆了,这句是判断是否连接上FTP的:if(ftpClient.isConnected()),已经连接上了,能再帮看看吗?[Quote=引用 2 楼 的回复:]
Java code
public void loginFtp(String path, String ip, Integer port, String username,
String password) {
log.info("ftp ip=" + ip);
log.info("ftp port=" + port);
……
[/Quote]
mohongweicwj 2012-08-03
  • 打赏
  • 举报
回复
是这样的,我已经登陆了,这句是判断是否连接上FTP的:if(ftpClient.isConnected()),已经连接上了,能再帮看看吗?
土圭垚 2012-08-03
  • 打赏
  • 举报
回复
public void loginFtp(String path, String ip, Integer port, String username,
String password) {
log.info("ftp ip=" + ip);
log.info("ftp port=" + port);
log.info("username=" + username);

try {
ftp = new FtpClient(ip, port);
ftp.login(username, password);// 登录
ftp.cd(path);
} catch (IOException e) {
log.error(e.getMessage());
String msg = " 登陆ftp:" + ip + "时发生如下错误!" + e.getMessage();
LifeUtil.instance().mail(msg);
e.printStackTrace();
}
}

这个是登录的方法,登录完了你才能下载。

登录以后再下载。。。。
public synchronized void downLoadFtpFile(String filename,
String newfilename, String path, String ip, Integer port,
String username, String password) throws IOException {
this.loginFtp(path, ip, port, username, password);
TelnetInputStream is = null;
FileOutputStream os = null;
try {
is = ftp.get(filename);
java.io.File outfile = new java.io.File(LOCAL_PATH + newfilename);

os = new FileOutputStream(outfile);
byte[] bytes = new byte[1024];
int c;

while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
log.info("download file " + filename + " success");
} catch (FileNotFoundException e) {
log.error(e.getMessage());
e.printStackTrace();
} catch (IOException e) {
log.error(e.getMessage());
e.printStackTrace();
} finally {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
this.closeServer();
}
}

土圭垚 2012-08-03
  • 打赏
  • 举报
回复
上传文件到ftp你必须得先登录,我想知道你的登录写在哪里的?
土圭垚 2012-08-03
  • 打赏
  • 举报
回复
这是完整代码,能跑的。上午我没找到ftp的测试工具,刚刚测试通过了。
package cn.com.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import sun.net.TelnetInputStream;
import sun.net.ftp.FtpClient;

@SuppressWarnings("static-access")
public class FtpLogin {

private static Log log = LogFactory.getLog(FtpLogin.class);
private FtpClient ftp;

private static String LOCAL_PATH = "D://";


/**
* 登陆ftp
*
* @param path
* 路径
* @param ip
* ip地址
* @param port
* 端口
* @param username
* 用户名
* @param password
* 密码
*/
public void loginFtp(String path, String ip, Integer port, String username,
String password) {

log.info("ftp ip=" + ip);
log.info("ftp port=" + port);
log.info("username=" + username);

try {
ftp = new FtpClient(ip, port);
ftp.login(username, password);// 登录
ftp.cd(path);
} catch (IOException e) {
log.error(e.getMessage());
e.printStackTrace();
}
}

/**
* 下载文件
*
* @param filename
* 要下载的文件名
* @param newfilename
* 新的文件名
* @param path
* 路径
* @param ip
* ip地址
* @param port
* 端口
* @param username
* 用户名
* @param password
* 密码
* @throws IOException
*/
public synchronized void downLoadFtpFile(String filename,
String newfilename, String path, String ip, Integer port,
String username, String password) throws IOException {
this.loginFtp(path, ip, port, username, password);
TelnetInputStream is = null;
FileOutputStream os = null;
try {
is = ftp.get(filename);
File outfile = new File(LOCAL_PATH + newfilename);

os = new FileOutputStream(outfile);
byte[] bytes = new byte[1024];
int c;

while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
log.info("download file " + filename + " success");
} catch (FileNotFoundException e) {
log.error(e.getMessage());
e.printStackTrace();
} catch (IOException e) {
log.error(e.getMessage());
e.printStackTrace();
} finally {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
this.closeServer();
}
}

/**
* 关闭ftp服务
*/
public void closeServer() {
if (ftp != null) {
try {
ftp.closeServer();
} catch (IOException e) {
log.error(e.getMessage());
e.printStackTrace();
}
}
}

/**
* 获取ftp上所有文件的文件名
*
* @throws IOException
*/
@SuppressWarnings("unchecked")
public List getFtpFileList(String path, String ip, Integer port,
String username, String password) throws IOException {
List ftpFileList = new ArrayList();
this.loginFtp(path, ip, port, username, password);
BufferedReader reader = null;
InputStreamReader in = null;

try {
in = new InputStreamReader(ftp.list());
reader = new BufferedReader(in);
String line = null;
while ((line = reader.readLine()) != null) {
int pos;
if ((pos = line.lastIndexOf(" ")) < 0) { // 取文件名(如果文件名为空)
continue;
}
String downFileName = line.substring(pos).trim();
if ((line.charAt(0) == '-')) { // line的第一个字母是d的话,是目录,否则不是,这个是Unix的ls
// -l的长格式输出。
ftpFileList.add(downFileName);
}
}
} catch (IOException e) {
log.error(e.getMessage());
e.printStackTrace();
} finally {
if (reader != null) {
reader.close();
}
if (in != null) {
in.close();
}
this.closeServer();
}
return ftpFileList;
}

public static void main(String[] args) throws Exception {
FtpLogin f = new FtpLogin();
f.loginFtp(".", "127.0.0.1", 21, "admin", "admin");
List ls = f.getFtpFileList(".", "127.0.0.1", 21, "admin", "admin");
for (int i = 0; i < ls.size(); i++) {
String name = (String)ls.get(i);
f.downLoadFtpFile(name, name, ".", "127.0.0.1", 21, "admin", "admin");
}
}
}

51,410

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧