文件名问题没遇到过。
文件大小的遇到过。。
我遇到的是下载小压缩包,压缩包小于 64k 时正常,大于64K 后只能解压出一部分约64K左右的数据。
后来发现是使用FTPClient 的时候配置参数中 WINDOWS 和LINUX 的问题。
你可以去尝试一下,从这个方面着手。
>
package ncuidocdoc_007;
import javaioFile;
import javaioFileInputStream;
import javaioFileOutputStream;
import javaioIOException;
import ncitfdocDocDelegator;
import ncvodocdoc_007DirVO;
import ncvopubBusinessException;
import ncvopubSuperVO;
import orgapachecommonsnetftpFTPClient;
import orgapachecommonsnetftpFTPFile;
import orgapachecommonsnetftpFTPReply;
import orgapachecommonsnetftpFTP;
public class FtpTool {
private FTPClient ftp;
private String romateDir = "";
private String userName = "";
private String password = "";
private String host = "";
private String port = "21";
public FtpTool(String url) throws IOException {
//String url="ftp://user:password@ip:port/ftptest/psd";
int len = urlindexOf("//");
String strTemp = urlsubstring(len + 2);
len = strTempindexOf(":");
userName = strTempsubstring(0, len);
strTemp = strTempsubstring(len + 1);
len = strTempindexOf("@");
password = strTempsubstring(0, len);
strTemp = strTempsubstring(len + 1);
host = "";
len = strTempindexOf(":");
if (len < 0)//没有设置端口
{
port = "21";
len = strTempindexOf("/");
if (len > -1) {
host = strTempsubstring(0, len);
strTemp = strTempsubstring(len + 1);
} else {
strTemp = "";
}
} else {
host = strTempsubstring(0, len);
strTemp = strTempsubstring(len + 1);
len = strTempindexOf("/");
if (len > -1) {
port = strTempsubstring(0, len);
strTemp = strTempsubstring(len + 1);
} else {
port = "21";
strTemp = "";
}
}
romateDir = strTemp;
ftp = new FTPClient();
ftpconnect(host, FormatStringToInt(port));
}
public FtpTool(String host, int port) throws IOException {
ftp = new FTPClient();
ftpconnect(host, port);
}
public String login(String username, String password) throws IOException {
thisftplogin(username, password);
return thisftpgetReplyString();
}
public String login() throws IOException {
thisftplogin(userName, password);
Systemoutprintln("ftp用户: " + userName);
Systemoutprintln("ftp密码: " + password);
if (!romateDirequals(""))
Systemoutprintln("cd " + romateDir);
ftpchangeWorkingDirectory(romateDir);
return thisftpgetReplyString();
}
public boolean upload(String pathname, String filename) throws IOException, BusinessException {
int reply;
int j;
String m_sfilename = null;
filename = CheckNullString(filename);
if (filenameequals(""))
return false;
reply = ftpgetReplyCode();
if (!FTPReplyisPositiveCompletion(reply)) {
ftpdisconnect();
Systemoutprintln("FTP server refused connection");
Systemexit(1);
}
FileInputStream is = null;
try {
File file_in;
if (pathnameendsWith(Fileseparator)) {
file_in = new File(pathname + filename);
} else {
file_in = new File(pathname + Fileseparator + filename);
}
if (file_inlength() == 0) {
Systemoutprintln("上传文件为空!");
return false;
}
//产生随机数最大到99
j = (int)(Mathrandom()100);
m_sfilename = StringvalueOf(j) + "pdf"; // 生成的文件名
is = new FileInputStream(file_in);
ftpsetFileType(FTPBINARY_FILE_TYPE);
ftpstoreFile(m_sfilename, is);
ftplogout();
} finally {
if (is != null) {
isclose();
}
}
Systemoutprintln("上传文件成功!");
return true;
}
public boolean delete(String filename) throws IOException {
FileInputStream is = null;
boolean retValue = false;
try {
retValue = ftpdeleteFile(filename);
ftplogout();
} finally {
if (is != null) {
isclose();
}
}
return retValue;
}
public void close() {
if (ftpisConnected()) {
try {
ftpdisconnect();
} catch (IOException e) {
eprintStackTrace();
}
}
}
public static int FormatStringToInt(String p_String) {
int intRe = 0;
if (p_String != null) {
if (!p_Stringtrim()equals("")) {
try {
intRe = IntegerparseInt(p_String);
} catch (Exception ex) {
}
}
}
return intRe;
}
public static String CheckNullString(String p_String) {
if (p_String == null)
return "";
else
return p_String;
}
public boolean downfile(String pathname, String filename) {
String outputFileName = null;
boolean retValue = false;
try {
FTPFile files[] = ftplistFiles();
int reply = ftpgetReplyCode();
////////////////////////////////////////////////
if (!FTPReplyisPositiveCompletion(reply)) {
try {
throw new Exception("Unable to get list of files to dowload");
} catch (Exception e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
/////////////////////////////////////////////////////
if (fileslength == 0) {
Systemoutprintln("No files are available for download");
}else {
for (int i=0; i <fileslength; i++) {
Systemoutprintln("Downloading file "+files[i]getName()+"Size:"+files[i]getSize());
outputFileName = pathname + filename + "pdf";
//return outputFileName;
File f = new File(outputFileName);
//////////////////////////////////////////////////////
retValue = ftpretrieveFile(outputFileName, new FileOutputStream(f));
if (!retValue) {
try {
throw new Exception ("Downloading of remote file"+files[i]getName()+" failed ftpretrieveFile() returned false");
} catch (Exception e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
}
}
/////////////////////////////////////////////////////////////
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
return retValue;
}
}
FTP 命令 FTP 的主要 *** 作都是基于各种命令基础之上的 常用的命令有 · 设置传输模式 它包括ASCⅡ(文本) 和BINARY 二进制模式;· 目录 *** 作 改变或显示远程计算机的当前目录(cd dir/ls 命令);· 连接 *** 作 open命令用于建立同远程计算机的连接 close命令用于关闭连接;· 发送 *** 作 put命令用于传送文件到远程计算机 mput 命令用于传送多个文件到远程计算机;· 获取 *** 作 get命令用于接收一个文件 mget命令用于接收多个文件 编程思路 根据FTP 的工作原理 在主函数中建立一个服务器套接字端口 等待客户端请求 一旦客户端请求被接受 服务器程序就建立一个服务器分线程 处理客户端的命令 如果客户端需要和服务器端进行文件的传输 则建立一个新的套接字连接来完成文件的 *** 作 编程技巧说明 主函数设计在主函数中 完成服务器端口的侦听和服务线程的创建 我们利用一个静态字符串变量initDir 来保存服务器线程运行时所在的工作目录 服务器的初始工作目录是由程序运行时用户输入的 缺省为C盘的根目录 具体的代码如下 public class ftpServer extends Thread{private Socket socketClient;private int counter;private static String initDir;public static void main(String[] args){if(args length != ) {initDir = args[ ];}else{ initDir = c: ;}int i = ;try{System out println( ftp server started! );//监听 号端口ServerSocket s = new ServerSocket( );for(;;){//接受客户端请求Socket ining = s accept();//创建服务线程new ftpServer(ining i) start();i++;}}catch(Exception e){}} 线程类的设计线程类的主要设计都是在run()方法中实现 用run()方法得到客户端的套接字信息 根据套接字得到输入流和输出流 向客户端发送欢迎信息 FTP 命令的处理( ) 访问控制命令· user name(user) 和 password (pass) 命令处理代码如下 if(str startsWith( USER )){user = str substring( );user = user trim();out println( Password );}if(str startsWith( PASS ))out println( User +user+ logged in );User 命令和 Password 命令分别用来提交客户端用户输入的用户名和口令 · CWD (CHANGE WORKING DIRECTORY) 命令处理代码如下 if(str startsWith( CWD )){String str = str substring( );dir = dir+ / +str trim();out println( CWD mand succesful );}该命令改变工作目录到用户指定的目录 · CDUP (CHANGE TO PARENT DIRECTORY) 命令处理代码如下 if(str startsWith( CDUP )){int n = dir lastIndexOf( / );dir = dir substring( n);out println( CWD mand succesful );}该命令改变当前目录为上一层目录 · QUIT命令处理代码如下 if(str startsWith( QUIT )) {out println( GOOD BYE );done = true;}该命令退出及关闭与服务器的连接 输出GOOD BYE ( ) 传输参数命令· Port命令处理代码如下 if(str startsWith( PORT )) {out println( PORT mand successful );int i = str length() ;int j = str lastIndexOf( );int k = str lastIndexOf( j );String str str ;str = ;str = ;for(int l=k+ ;lstr = str + str charAt(l);}for(int l=j+ ;l<=i;l++){str = str + str charAt(l);}tempPort = Integer parseInt(str ) +Integer parseInt(str );}使用该命令时 客户端必须发送客户端用于接收数据的 位IP 地址和 位 的TCP 端口号 这些信息以 位为一组 使用十进制传输 中间用逗号隔开 · TYPE命令处理代码如下 if(str startsWith( TYPE )){out println( type set );}TYPE 命令用来完成类型设置 ( ) FTP 服务命令· RETR (RETEIEVE) 和 STORE (STORE)命令处理的代码if(str startsWith( RETR )){out println( Binary data connection );str = str substring( );str = str trim();RandomAccessFile outFile = newRandomAccessFile(dir+ / +str r );Socket tempSocket = new Socket(host tempPort);OutputStream outSocket = tempSocket getOutputStream();byte byteBuffer[]= new byte[ ];int amount;try{while((amount = outFile read(byteBuffer)) != ){outSocket write(byteBuffer amount);}outSocket close();out println( transfer plete );outFile close();tempSocket close();}catch(IOException e){}}if(str startsWith( STOR )){out println( Binary data connection );str = str substring( );str = str trim();RandomAccessFile inFile = newRandomAccessFile(dir+ / +str rw );Socket tempSocket = new Socket(host tempPort);InputStream inSocket = tempSocket getInputStream();byte byteBuffer[] = new byte[ ];int amount;try{while((amount =inSocket read(byteBuffer) )!= ){inFile write(byteBuffer amount);}inSocket close();out println( transfer plete );inFile close();tempSocket close();}catch(IOException e){}}文件传输命令包括从服务器中获得文件RETR和向服务器中发送文件STOR 这两个命令的处理非常类似 处理RETR命令时 首先得到用户要获得的文件的名称 根据名称创建一个文件输入流 然后和客户端建立临时套接字连接 并得到一个输出流 随后 将文件输入流中的数据读出并借助于套接字输出流发送到客户端 传输完毕以后 关闭流和临时套接字 STOR 命令的处理也是同样的过程 只是方向正好相反 · DELE (DELETE)命令处理代码如下 if(str startsWith( DELE )){str = str substring( );str = str trim();File file = new File(dir str);boolean del = file delete();out println( delete mand successful );}DELE 命令用于删除服务器上的指定文件 · LIST命令处理代码如下 if(str startsWith( LIST )) {try{out println( ASCII data );Socket tempSocket = new Socket(host tempPort);PrintWriter out = new PrintWriter(tempSocket getOutputStream() true);File file = new File(dir);String[] dirStructure = new String[ ];dirStructure= file list();String strType= ;for(int i= ;iif( dirStructure[i] indexOf( ) == ) { strType = d ;}else{strType = ;}out println(strType+dirStructure[i]);}tempSocket close();out println( transfer plete );}catch(IOException e){}LIST 命令用于向客户端返回服务器中工作目录下的目录结构 包括文件和目录的列表 处理这个命令时 先创建一个临时的套接字向客户端发送目录信息 这个套接字的目的端口号缺省为 然后为当前工作目录创建File 对象 利用该对象的list()方法得到一个包含该目录下所有文件和子目录名称的字符串数组 然后根据名称中是否含有文件名中特有的 来区别目录和文件 最后 将得到的名称数组通过临时套接字发送到客户端 lishixinzhi/Article/program/Java/JSP/201311/19211
以上就是关于使用java程序到ftp抓取文件并保存到数据库中 若文件名包含英文像wea.png retrieveFileStream方法获取为空全部的内容,包括:使用java程序到ftp抓取文件并保存到数据库中 若文件名包含英文像wea.png retrieveFileStream方法获取为空、java怎么打开FTP服务器上的文件、JAVA 如何实现FTP远程路径等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)