我在客户端打开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;
}
可是上传失败,报的错误是“此文件或文件夹有误或不存在!”
但是要是直接在服务器上跑这个程序的话,可以正常上传,就是在客户端跑的时候,
想把客户端的一个文件上传到服务器的时候报错误!还有就是我下载的时候,却保存在了服务器的盘符下,而不是保存在客户单的本地路径。
我的代码哪里写的不对啊,请帮忙指正!
谢谢
代码如下: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;
}
/**
* 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;
}
}