我在客户端打开JSP页面,想把我本地的一个文件夹上传到FTP服务器上去,
可是上传失败,报的错误是“此文件或文件夹有误或不存在!”
但是要是直接在服务器上跑这个程序的话,可以正常上传,就是在客户端跑的时候,
想把客户端的一个文件上传到服务器的时候报错误!还有就是我下载的时候,却保存在了服务器的盘符下,而不是保存在客户单的本地路径。
我的代码哪里写的不对啊,请帮忙指正!
谢谢
代码如下:import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.StringTokenizer;import sun.net.TelnetInputStream;
import sun.net.ftp.FtpClient;/**
 * 对ftp进行上传、下载文件夹操作
 * 
 */
public class Ftp {
// ftp服务器的IP地址
private String ip = "127.0.0.1";  
// 用户名
private String username = "test"; 
// 密码
private String password = "test"; 
// 需要上传的目录,带绝对路径
private String localfilefullname = "";
FtpClient ftpclient = null;
OutputStream os = null;
FileInputStream is = null;

/**
 * 取得参数值
 * 
 * @param serverIP 上传IP
 * @param username 用户名
 * @param password 密码
 */
public Ftp(String serverIP,String username, String password) {
//IP
        this.ip = serverIP; 
        //用户名
this.username = username; 
//密码
this.password = password;
    } /**
  * 检查文件夹是否存在
  * 
  * @param dir
  * @param ftpclient
  * @return
  */
private boolean isdirexist(String dir, FtpClient ftpclient)throws Exception {
try {
ftpclient.cd(dir);
} catch (Exception e) {
return false;
}
return true;
}
/**
  * ftp上传
  * 
  * @param prefix 创建的文件夹名
  * @param localfilefullname 上传的源文件夹
  * @return
  */
public boolean upload(String prefix,String localfilefullname)throws Exception {
this.localfilefullname = localfilefullname;
try {
String savefilename = localfilefullname;
// 新建一个ftp客户端连
ftpclient = new FtpClient(); 

ftpclient.openServer(this.ip);
ftpclient.login(this.username, this.password); // 打开本地待上传的文件
File file_in = new File(savefilename);
processfile(prefix,file_in, ftpclient);
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (ftpclient != null) {
ftpclient.closeServer();
}
return true;
} catch (Exception e) {
e.printStackTrace();
System.err.println("exception e in ftp upload(): " + e.toString());
return false;
} finally {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (ftpclient != null) {
ftpclient.closeServer();
}
}
}

/**
  * 用递归算法来上传文件
  * 
  * @param prefix 创建的文件夹名
  * @param source 路径
  * @param ftpclient
  * @throws exception
  */
private void processfile(String prefix,File source, FtpClient ftpclient)throws Exception {
if (source.exists()) {
if (source.isDirectory()) {
//对文件路径进行转义
String path = prefix + source.getPath().substring(localfilefullname.length()).replace("\\", "/");
if (!isdirexist(path, ftpclient)) {
//创建文件夹
createdir(path, ftpclient);
}
File sourcefile[] = source.listFiles();
for (int i = 0; i < sourcefile.length; i++) {
if (sourcefile[i].exists()) {
if (sourcefile[i].isDirectory()) {
this.processfile(prefix,sourcefile[i], ftpclient);
} else {
ftpclient.cd(cheangpath(prefix,sourcefile[i].getPath()));
ftpclient.binary();
os = ftpclient.put(sourcefile[i].getName());
byte[] bytes = new byte[1024];
is = new FileInputStream(sourcefile[i]);
// 开始复制
int c;
// 暂未考虑中途终止的情况
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
is.close();
os.close();
}
}
}
}else{
ftpclient.cd(cheangpath(prefix,source.getPath()));
ftpclient.binary();
os = ftpclient.put(source.getName());
byte[] bytes = new byte[1024];
is = new FileInputStream(source);
// 开始复制
int c;
// 暂未考虑中途终止的情况
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
is.close();
os.close();
}
} else {
throw new Exception("此文件或文件夹[" + source.getName() + "]有误或不存在!");
}
}

/**
  * 创建文件夹
  * 
  * @param dir
  * @param ftpclient
  * @throws exception
  */
private void createdir(String dir, FtpClient ftpclient) throws Exception {
    ftpclient.ascii();
    StringTokenizer s = new StringTokenizer(dir, "/");
    s.countTokens();
    String pathname = "";
    while (s.hasMoreElements()) {
       pathname = pathname + "/" + (String) s.nextElement();
       try {
              ftpclient.sendServer("mkd " + pathname + "\r\n");// 如果服务器上有该目录,不会被创建
       } catch (Exception e) {
        e = null;
       }
       ftpclient.readServerResponse();
    }
    ftpclient.binary();
}

/**
  * 获取当前的ftp路径
  * 
  * @param prefix
  * @param path
  * @return
  */
private String cheangpath(String prefix,String path) throws Exception {
path = path.substring(localfilefullname.length()).replace("\\", "/");
if ("".equals(path)) {
path = "/";
} else {
path = path.substring(0, path.lastIndexOf("/") + 1);
}
path = prefix + path;
return path;
}
/**
  * 递归算法,取得文件的字节大小
  * 
  * @param strName 文件名带绝对路径    
  * @return
  */
public Long getSize(String strName) {
Long TotalSize = 0L;
File f = new File(strName);
if (f.isFile()){
return f.length();
}else {
if (f.isDirectory()) {
File[] contents = f.listFiles();
for (int i = 0; i < contents.length; i++) {
if (contents[i].isFile())
TotalSize += contents[i].length();
else {
if (contents[i].isDirectory())
TotalSize += getSize(contents[i].getPath());
}
}
}
}
return TotalSize;
}

解决方案 »

  1.   


    /**
      * ftp下载文件
      * 
      * @param localPath
      * @param remotePath
      * @return
      * @throws Exception
      */
    public boolean download(String localPath, String remotePath)throws Exception {
    this.localfilefullname = localfilefullname;
    try {
    String savefilename = localfilefullname;
    // 新建一个ftp客户端连
    ftpclient = new FtpClient();
    ftpclient.openServer(this.ip);
    ftpclient.login(this.username, this.password);
    ftpclient.cd(remotePath);
    processdownload(localPath, remotePath);
    if (is != null) {
    is.close();
    }
    if (os != null) {
    os.close();
    }
    if (ftpclient != null) {
    ftpclient.closeServer();
    }
    return true;
    } catch (Exception e) {
    e.printStackTrace();
    System.err.println("exception e in ftp upload(): " + e.toString());
    return false;
    } finally {
    if (is != null) {
    is.close();
    }
    if (os != null) {
    os.close();
    }
    if (ftpclient != null) {
    ftpclient.closeServer();
    }
    }
    }

    /**
      * 递归下载文件
      * 
      * @param localPath
      * @param remotePath
      */
    public void processdownload(String localPath, String remotePath) {
    FileOutputStream outStream = null;
    ArrayList list = null;
    try {
    list = getFileList(remotePath);
    ftpclient.binary();
    File temp = null;
    for (int i = 0; i < list.size(); i++) {
    // 如果是文件,则直接执行下载
    if (isFile(list.get(i).toString())) {
    ftpclient.cd(remotePath);
    ArrayList listfileName = getNameList(remotePath);
    for (int j = 0; j < listfileName.size(); j++) {
    temp = new File(localPath + File.separator + listfileName.get(j).toString());
    outStream = new FileOutputStream(temp);
    TelnetInputStream is = ftpclient.get(listfileName.get(j).toString());
    byte[] bytes = new byte[1024];
    int c;
    // 暂未考虑中途终止的情况
    while ((c = is.read(bytes)) != -1) {
    outStream.write(bytes, 0, c);
    }
    is.close();
    outStream.close();
    System.out.println("成功下载文件:" + remotePath + File.separator + listfileName.get(j).toString());
    }
    } else if (isDir(list.get(i).toString())){// 是目录
    temp = new File(localPath + File.separator + getFileName(list.get(i).toString()));
    temp.mkdirs();
    String newRemote = remotePath + File.separator + getFileName(list.get(i).toString());
    processdownload(localPath + File.separator + getFileName(list.get(i).toString()), newRemote);
    }
    }
    } catch (Exception ex) {
    ex.printStackTrace();
    } finally {
    try {
    outStream.close();
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }
    }

    /**
      * 返回文件夹或者文件的名称
      * 
      * @param line
      * @return
      */
    public String getFileName(String line) {
    String filename = (String) parseLine(line).get(8);
    return filename;
    }

    /**
      * 返回当前目录的文件名称
      * 
      * @return
      * @throws IOException
      */
    public ArrayList getNameList(String remotePath) throws IOException {
    BufferedReader dr = new BufferedReader(new InputStreamReader(ftpclient.nameList(remotePath)));
    ArrayList al = new ArrayList();
    String s = "";
    while ((s = dr.readLine()) != null) {
    System.out.println("filename:" + s);
    al.add(s);
    }
    return al;
    }

    /**
      * 返回当前目录的所有文件及文件夹
      * 
      * @return
      * @throws IOException
      */
    public ArrayList getFileList(String remotePath) throws IOException {
    ftpclient.cd(remotePath);
    BufferedReader dr = new BufferedReader(new InputStreamReader(ftpclient.list()));
    ArrayList al = new ArrayList();
    String s = "";
    while ((s = dr.readLine()) != null) {
    System.out.println("readLine:" + s);
    if ((!((String) parseLine(s).get(8)).equals("."))&& (!((String) parseLine(s).get(8)).equals(".."))) {
    al.add(s);
    System.out.println("s:" + s);
    }
    }
    return al;
    }

    /**
      * 判断一行文件信息是否为目录
      * 
      * @param line
      * @return
      */
    public boolean isFile(String line) {
    return !isDir(line);
    }

    public boolean isDir(String line) {
    return ((String) parseLine(line).get(0)).indexOf("d") != -1;
    }

    /**
      * 处理getFileList取得的行信息
      * 
      * @param line
      * @return
      */
    private ArrayList parseLine(String line) {
    ArrayList s1 = new ArrayList();
    StringTokenizer st = new StringTokenizer(line, " ");
    while (st.hasMoreTokens()) {
    s1.add(st.nextToken());
    }
    return s1;
    }
    }
      

  2.   

    你怎么解决的,我也遇到了,在A电脑上面部署了项目,FTP服务器也部署在A电脑上面,在B电脑上面跑的时候文件却下载到了A,而不是B,挺郁闷的,楼主你怎么解决的!可以把代码全部贴出来吗