java直接从数据库读取文件写入FTP服务器

以前做过类似的情况,当时是先从数据库读取文件放到本地然后从本地再上传到FTP服务器;(JAVA操作数据库→本地→FTP服务器)
今天这个功能则是(JAVA操作数据库→FTP服务器);

一上来直接把以前的代码拉出来用了
import org.apache.commons.net.ftp.FTPClient;
诶?怎么报错呀。。。没有这个包?当时逗比了 第一反应看到报错提示 就把切换成了
sun.net.ftp.FtpClient; 然后直接连上了,但是往FTP上传时老是定位不到正确的方法;什么putFile putFileStream 好像都会报错。。。 (原因也可能跟下面有关系)

纠结了半天再网上找了找发现import org.apache.commons.net.ftp.FTPClient; 逗比了我,这里报错明显就是没JAR包呀。。。因为我的Meavn我感觉基本java包都有,第一下没想到这个问题 然后百度了下 需要引入

<dependency>
		<groupId>commons-net</groupId>
		<artifactId>commons-net</artifactId>
		<version>3.0</version>
</dependency>

然后apache下的这个包有了。

/**
*
* @param path 上传到ftp服务器哪个路径下
* @param addr 地址
* @param port 端口号
* @param username 用户名
* @param password 密码
* @return
* @throws Exception
*/

public  boolean connect(String addr,String port,String path,String username,String password) throws Exception {      
	boolean result = false; 
    ftp = new FTPClient();      
    int reply;      
    ftp.connect(addr,Integer.parseInt(port));      
    ftp.login(username,password);      
    ftp.setFileType(FTPClient.BINARY_FILE_TYPE);      
    reply = ftp.getReplyCode();    
   // System.out.println("初始化Ftp得到的reply========="+reply);
    if (!FTPReply.isPositiveCompletion(reply)) {      
        ftp.disconnect(); 
       LogUtils.getLog().info("未连接上");
        return result;      
    }  
   // FTPFile[] files=ftp.listFiles("/");
    LogUtils.getLog().info("连接上了");
    ftp.changeWorkingDirectory(path); 
    
    result = true;      
    return result;  
}  

这样也就连接上了。。。

//通过流写入文件则通过以下代码
      InputStream is = null;
	 is = new ByteArrayInputStream(sb.toString().getBytes());//sb是要写入的内容
				 ftp.setControlEncoding("GBK");//不加入会乱码
				 ftp.enterLocalPassiveMode();//这个目前没get到 
				boolean isStore= ftp.storeFile(fileName.toString(),is);//最主要的一句话
				if(isStore==false) {
					LogUtils.getLog().info("storeFile写入数据失败");
				}else {
				 LogUtils.getLog().info("文件写入成功");
				}
				System.out.println("ftp.getReplyCode()========="+ftp.getReplyCode());

ftp.storeFile这个方法返回一个boolean值;如果是true代表传送成功;false则代表失败。 前面一直返回false;也不提示什么错。。。。这个最恶心,我怎么知道哪里错了。然后继续搜索到这样一句话
https://stackoverflow.com/questions/8154115/ftpclient-storefile-always-return-false
Immediately after connecting is the only real time you need to check the reply code (because connect is of type void). The convention for all the FTP command methods in FTPClient is such that they either return a boolean value or some other value. The boolean methods return true on a successful completion reply from the FTP server and false on a reply resulting in an error condition or failure. The methods returning a value other than boolean return a value containing the higher level data produced by the FTP command, or null if a reply resulted in an error condition or failure. If you want to access the exact FTP reply code causing a success or failure, you must call getReplyCode after a success or failure.
大概意思就是通过ftp.getReplyCode()得到返回码 然后可以去
https://en.wikipedia.org/wiki/List_of_FTP_server_return_codes 这里查询原因
我这边一直报错550。。
列表提示550代表 Requested action not taken. File unavailable (e.g., file not found, no access). 请求未执行。。。虽然我还是不知道怎么回事 但是大概意思就是文件未找到或者没权限。

我就去找局方问了下他重新给我了一个地址。。。同样连不上。。。但是却报了一个错误 socekt closed… 意思就是发送的时候 连接关闭了。然后我就准备去看源码,但是好像刚才下commons-net的时候 只下载了jar包没下载source源文件。
查了下,把eclipse的meavn设置下
在这里插入图片描述重新下载就行了。。。然后重新下载的时候我把 commons-net的版本从3.0改为3.6。
只是想下载个最新的版本而已。
但是TMD就这样 竟然不报错。。。socket closed 竟然不出现了 。。。直接提示我上传成功,而且是真的成功了。

然而第一次给我的FTP地址还是会报错。。很奇怪哦。。这个工作还没做完。。里面有错误我会持续更新下 直到这个工作完成。。

继续更新 大清早的思路就是能开阔一点。。 昨天550那个错误百思不得其解,今天早上就找到原因了 不废话没图我说个JB。
在这里插入图片描述我手动在XFTP里面拖拽文件 然后提示错误 点开一看 是不是好熟悉呀哈哈哈哈。说明不是代码问题了,FTP服务器有问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值