请问客户端的文件夹上传到FTP服务器 以及下载到本地 的有关问题

请教客户端的文件夹上传到FTP服务器 以及下载到本地 的问题
我在客户端打开JSP页面,想把我本地的一个文件夹上传到FTP服务器上去,
可是上传失败,报的错误是“此文件或文件夹有误或不存在!”
但是要是直接在服务器上跑这个程序的话,可以正常上传,就是在客户端跑的时候,
想把客户端的一个文件上传到服务器的时候报错误!

还有就是我下载的时候,却保存在了服务器的盘符下,而不是保存在客户单的本地路径。
我的代码哪里写的不对啊,请帮忙指正!
谢谢
代码如下:
Java code

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