使用java程序到ftp抓取文件并保存到数据库中 若文件名包含英文像wea.png retrieveFileStream方法获取为空

使用java程序到ftp抓取文件并保存到数据库中 若文件名包含英文像wea.png retrieveFileStream方法获取为空,第1张

文件名问题没遇到过。

文件大小的遇到过。。

我遇到的是下载小压缩包,压缩包小于 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远程路径等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10092001.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存