今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下。结果悲剧了,运行不通过。(装逼失败)

我找的文章链接:http://blog.csdn.net/yucaifu1989/article/details/51483118

为了方便大家对比,我吧文章代码偷了过来:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
import sun.net.ftp.FtpProtocolException;
/**
* Java自带的API对FTP的操作
* @Jdk:version 1.7
* @Title:Ftp.java
* @author: boonya
* @notice: 貌似此方法有个缺陷,不能操作大文件
*/
public class FtpJdk
{
/**
*
* 本地文件名
*/
private String localfilename;
/**
*
* 远程文件名
*/
private String remotefilename;
/**
*
* FTP客户端
*/
private FtpClient ftpClient; /**
* 服务器连接
*
* @param ip
* 服务器IP
* @param port
* 服务器端口
* @param user
* 用户名
* @param password
* 密码
* @param path
* 服务器路径
* @throws FtpProtocolException
*
*/
public void connectServer(String ip, int port, String user, String password, String path) throws FtpProtocolException
{
try
{
/* ******连接服务器的两种方法****** */
// 第一种方法
/*
* ftpClient =FtpClient.create();
* ftpClient.connect(new InetSocketAddress(ip, port));
*/
// 第二种方法
ftpClient = FtpClient.create(ip);
ftpClient.login(user, null, password);
// 设置成2进制传输
ftpClient.setBinaryType();
System.out.println("login success!"); if (path.length() != 0)
{
// 把远程系统上的目录切换到参数path所指定的目录
ftpClient.changeDirectory(path);
}
ftpClient.setBinaryType();
} catch (IOException ex)
{
ex.printStackTrace();
throw new RuntimeException(ex);
} } /**
* 关闭连接
*
*/ public void closeConnect()
{
try
{
ftpClient.close();
System.out.println("disconnect success");
} catch (IOException ex)
{
System.out.println("not disconnect");
ex.printStackTrace();
throw new RuntimeException(ex);
}
} /**
*
* 上传文件
*
* @param localFile
* 本地文件
* @param remoteFile
* 远程文件
* @throws FtpProtocolException
*/
public void upload(String localFile, String remoteFile) throws FtpProtocolException
{
this.localfilename = localFile;
this.remotefilename = remoteFile;
TelnetOutputStream os = null;
FileInputStream is = null;
try
{
// 将远程文件加入输出流中
os = (TelnetOutputStream) ftpClient.putFileStream(this.remotefilename, true); // 获取本地文件的输入流
File file_in = new File(this.localfilename);
is = new FileInputStream(file_in); // 创建一个缓冲区
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1)
{
os.write(bytes, 0, c);
}
System.out.println("upload success");
} catch (IOException ex)
{
System.out.println("not upload");
ex.printStackTrace();
throw new RuntimeException(ex);
} finally
{
try
{
if (is != null)
{
is.close();
}
} catch (IOException e)
{
e.printStackTrace();
} finally
{
try
{
if (os != null)
{
os.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}
} /**
*
* 下载文件
*
* @param remoteFile
* 远程文件路径(服务器端)
* @param localFile
* 本地文件路径(客户端)
* @throws FtpProtocolException
*
*/
public void download(String remoteFile, String localFile) throws FtpProtocolException
{
TelnetInputStream is = null;
FileOutputStream os = null;
try
{ // 获取远程机器上的文件filename,借助TelnetInputStream把该文件传送到本地。
is = (TelnetInputStream) ftpClient.getFileStream(remoteFile);
File file_in = new File(localFile);
os = new FileOutputStream(file_in); byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1)
{
os.write(bytes, 0, c);
}
System.out.println("download success");
} catch (IOException ex)
{
System.out.println("not download");
ex.printStackTrace();
throw new RuntimeException(ex);
} finally
{
try
{
if (is != null)
{
is.close();
}
} catch (IOException e)
{
e.printStackTrace();
} finally
{
try
{
if (os != null)
{
os.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}
} /**
* 函数入口
*
* @param agrs
*/
public static void main(String agrs[])
{ String filepath[] =
{ "/temp/aa.txt", "/temp/regist.log" };
String localfilepath[] =
{ "C:\\tmp\\1.txt", "C:\\tmp\\2.log" };
FtpJdk ftp = new FtpJdk();
/*
* 使用默认的端口号、用户名、密码以及根目录连接FTP服务器
*/
try
{
ftp.connectServer("127.0.0.1", 22, "boonya", "user@", "/temp");
} catch (FtpProtocolException e)
{
e.printStackTrace();
}
// 下载
for (int i = 0; i < filepath.length; i++)
{
try
{
ftp.download(filepath[i], localfilepath[i]);
} catch (FtpProtocolException e)
{
e.printStackTrace();
}
}
String localfile = "E:\\contact.txt";
String remotefile = "/temp/records.txt";
// 上传
try
{
ftp.upload(localfile, remotefile);
} catch (FtpProtocolException e)
{
e.printStackTrace();
}
ftp.closeConnect();
} }

文章代码

顺便把错误的log贴出来:

sun.net.ftp.FtpProtocolException: TYPE I:530 Please login with USER and PASS.

    at sun.net.ftp.impl.FtpClient.issueCommandCheck(FtpClient.java:544)
at sun.net.ftp.impl.FtpClient.setType(FtpClient.java:1668)
at sun.net.ftp.FtpClient.setBinaryType(FtpClient.java:676)
at ftp.FtpJdk.connectServer(FtpJdk.java:67)
at ftp.FtpJdk.main(FtpJdk.java:248)
not upload
Disconnected from the target VM, address: '127.0.0.1:49353', transport: 'socket'
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
at sun.net.ftp.impl.FtpClient.readServerResponse(FtpClient.java:420)
at sun.net.ftp.impl.FtpClient.readReply(FtpClient.java:497)
at sun.net.ftp.impl.FtpClient.issueCommand(FtpClient.java:532)
at sun.net.ftp.impl.FtpClient.issueCommandCheck(FtpClient.java:543)
at sun.net.ftp.impl.FtpClient.openDataConnection(FtpClient.java:757)
at sun.net.ftp.impl.FtpClient.putFileStream(FtpClient.java:1320)
at ftp.FtpJdk.upload(FtpJdk.java:122)
at ftp.FtpJdk.main(FtpJdk.java:269)
Exception in thread "main" java.lang.RuntimeException: java.net.SocketTimeoutException: Read timed out
at ftp.FtpJdk.upload(FtpJdk.java:140)
at ftp.FtpJdk.main(FtpJdk.java:269)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
at sun.net.ftp.impl.FtpClient.readServerResponse(FtpClient.java:420)
at sun.net.ftp.impl.FtpClient.readReply(FtpClient.java:497)
at sun.net.ftp.impl.FtpClient.issueCommand(FtpClient.java:532)
at sun.net.ftp.impl.FtpClient.issueCommandCheck(FtpClient.java:543)
at sun.net.ftp.impl.FtpClient.openDataConnection(FtpClient.java:757)
at sun.net.ftp.impl.FtpClient.putFileStream(FtpClient.java:1320)
at ftp.FtpJdk.upload(FtpJdk.java:122)
... 1 more

错误log

有兴趣的可以研究一下,希望找到原因的可以告诉一下博主,谢谢。

尽管博主装逼失败,但逼装了,还是要继续装下去的,于是,找到了以下的办法,博主亲测成功,不成功可以联系博主。不多说直接贴代码:

用到的jar:

commons-net-1.4.1.jar

maven下载

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

ftp工具类:

package ftp.ftp2;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpProtocolException; import java.io.*;
import java.net.SocketException;
import java.util.Properties; public class FtpUtil { /**
* 获取FTPClient对象
*
* @param ftpHost FTP主机服务器
* @param ftpPassword FTP 登录密码
* @param ftpUserName FTP登录用户名
* @param ftpPort FTP端口 默认为21
* @return
*/
public static FTPClient getFTPClient(String ftpHost, String ftpUserName,
String ftpPassword, int ftpPort) {
FTPClient ftpClient = new FTPClient();
try {
ftpClient = new FTPClient();
ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
System.out.println("未连接到FTP,用户名或密码错误。");
ftpClient.disconnect();
} else {
System.out.println("FTP连接成功。");
}
} catch (SocketException e) {
e.printStackTrace();
System.out.println("FTP的IP地址可能错误,请正确配置。");
} catch (IOException e) {
e.printStackTrace();
System.out.println("FTP的端口错误,请正确配置。");
}
return ftpClient;
} /*
* 从FTP服务器下载文件
*
* @param ftpHost FTP IP地址
* @param ftpUserName FTP 用户名
* @param ftpPassword FTP用户名密码
* @param ftpPort FTP端口
* @param ftpPath FTP服务器中文件所在路径 格式: ftptest/aa
* @param localPath 下载到本地的位置 格式:H:/download
* @param fileName 文件名称
*/
public static void downloadFtpFile(String ftpHost, String ftpUserName,
String ftpPassword, int ftpPort, String ftpPath, String localPath,
String fileName) { FTPClient ftpClient = null; try {
ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
ftpClient.setControlEncoding("UTF-8"); // 中文支持
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
ftpClient.changeWorkingDirectory(ftpPath); File localFile = new File(localPath + File.separatorChar + fileName);
OutputStream os = new FileOutputStream(localFile);
ftpClient.retrieveFile(fileName, os);
os.close();
ftpClient.logout(); } catch (FileNotFoundException e) {
System.out.println("没有找到" + ftpPath + "文件");
e.printStackTrace();
} catch (SocketException e) {
System.out.println("连接FTP失败.");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件读取错误。");
e.printStackTrace();
} } /**
* Description: 向FTP服务器上传文件
* @param ftpHost FTP服务器hostname
* @param ftpUserName 账号
* @param ftpPassword 密码
* @param ftpPort 端口
* @param ftpPath FTP服务器中文件所在路径 格式: ftptest/aa
* @param fileName ftp文件名称
* @param input 文件流
* @return 成功返回true,否则返回false
*/
public static boolean uploadFile(String ftpHost, String ftpUserName,
String ftpPassword, int ftpPort, String ftpPath,
String fileName,InputStream input) {
boolean success = false;
FTPClient ftpClient = null;
try {
int reply;
ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
return success;
}
ftpClient.setControlEncoding("UTF-8"); // 中文支持
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
ftpClient.changeWorkingDirectory(ftpPath); ftpClient.storeFile(fileName, input); input.close();
ftpClient.logout();
success = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
} }

测试类:

package ftp.ftp2;

import java.io.*;

/**
* Created by jyf on 2017/6/2.
*/
public class test {
public static void main(String[] args) {
String ftpHost = "172.16.114.10";
String ftpUserName = "user";
String ftpPassword = "a";
int ftpPort = 21;
String ftpPath = "test2/";
String localPath = "F:\\11.txt";
String fileName = "11.txt"; //上传一个文件
try{
FileInputStream in=new FileInputStream(new File(localPath));
boolean test = FtpUtil.uploadFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, fileName,in);
System.out.println(test);
} catch (FileNotFoundException e){
e.printStackTrace();
System.out.println(e);
} //在FTP服务器上生成一个文件,并将一个字符串写入到该文件中
try {
InputStream input = new ByteArrayInputStream("test ftp jyf".getBytes("GBK"));
boolean flag = FtpUtil.uploadFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, fileName,input);;
System.out.println(flag);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} //下载一个文件
FtpUtil.downloadFtpFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, localPath, fileName);
}
}

希望可以帮助到大家,也希望对自己的知识做个记录,感谢网上那些大神们的代码分享,有雷同,希望联系博主更改

Java ftp 上传文件和下载文件的更多相关文章

  1. Java ftp上传文件方法效率对比

    Java ftp上传文件方法效率对比 一.功能简介: txt文件采用ftp方式从windows传输到Linux系统: 二.ftp实现方法 (1)方法一:采用二进制流传输,设置缓冲区,速度快,50M的t ...

  2. java FTP 上传下载删除文件

    在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件 ...

  3. Java.ftp上传下载

    1:jar的maven的引用: 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  4. Jenkins通过FTP上传站点太多文件导致太慢且不稳定,切换为压包上传再解压的思路(asp.net)

    在本地先处理好要上传的站点文件之后,可能会因为一些网页切图导致ftp上传不稳定,中断,或者文件占用的问题. 那么换了一种实现思路,要借助jenkins的工具jenkins-cli.jar. 解决思路: ...

  5. 批处理向FTP上传指定属性的文件 批处理增量备份的例子

    使用windows批处理向FTP上传具有指定属性的文件,类似增量备份功能. 对一个目录里的几个文件自动上传FTP时只上传有归档属性的文件,然后FTP上传成功后自动清除(本机)刚上传文件的归档属性. 类 ...

  6. java ftp上传文件 工具类

    package com.learning.spboot.utils; import com.jcraft.jsch.*; import org.apache.commons.net.ftp.FTPCl ...

  7. java ftp上传文件

    /** * 上传文件到ftp * @param server * @param user * @param pwd * @param filenames */ public static void u ...

  8. 20160113006 asp.net实现ftp上传代码(解决大文件上传问题)

    using System;using System.Configuration;using System.Data;using System.Linq;using System.Web;using S ...

  9. Xshell 本地上传、远程下载文件

    1.Xshell登录工具在创建会话的时候,点击最下面的ZMODEM,可以填写下载的路径和加载的路径:2个路径可以一样也可以不一样: 在下载的时候可以下载到相应的路径去.(我设置的是下载前始终询问) 2 ...

随机推荐

  1. Angular通过订阅观察者对象实现不同组件中数据的实时传递

    在angular官方定义中,组件直接的数据交换只要在父子直接传递,但是我们在项目中经常需要在各种层级之间传递数据,下面介绍关于订阅可观察对象实现的数据传递. 首先定义一个服务app.sevice.ts ...

  2. ssm整合快速入门程序(三)之Data类型转换器

    今天就写写springmvc配置Data类型转换器 首先在创建一个转换器的包cn.my.ssm.controller.converter,创建一个CustomDateConverter类实现Conve ...

  3. 【POI2001】【HDU1814】和平委员会

    题面 Description 根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立. 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍. 此委员会必须满足下列条 ...

  4. c++面试遇到问题

    1. C 和 C++ 区别      2. const 有什么用途     主要有三点: 1:定义只读变量,即常量 2:修饰函数的参数和函数的返回值 3: 修饰函数的定义体,这里的函数为类的成员函数, ...

  5. Nginx负载均衡——扩展功能(NGINX Plus)

    本文主要是介绍了NGINX Plus的相关功能,横跨了NGINX Plus R5/R6/R7/R9等各个不同版本的更新. 什么是NGINX Plus? 顾名思义,就是Nginx的加强版或者扩展版.我们 ...

  6. js对象的合并

    问题情况:将2个或2个以上对象(object{....})中的属性进行合并,即最后合并为一个object{.....}传递给后端. 问题场景:多页表单数据的一同提交 解决办法:Object.assig ...

  7. js文本框字符数输入限制

    我们常常在前台页面做一些文本输入长度的验证,为什么呢?因为数据库字段设置了大小,如果不限制输入长度,那么写入库时就会引发字符串截断异常.今天就给大家分享一个jquery插件来解决这一问题. (func ...

  8. WordPress设置圆形旋转头像的方法

    很多网站的评论者的头像都是圆形的,并且当你的鼠标移上去的时候会旋转,那么这个怎么实现呢,我在网上找了很多,但是和我的主题都不适用,现在把我修改后的代码贴出来,只要将下面的代码添加到style.css中 ...

  9. WordPress评论时一键填入昵称、邮箱和网址

    现在很多博客都启用了多说,可是依然有很多博主坚守着wordpress或其主题自带的评论框,这样,每当我们访问这些博客时,发现精彩的内容或者 找到共鸣时.抑或只是想挑逗一下博主,准备在评论处爽爽的来一发 ...

  10. OpenStack中的rabbitmq的配置方法

    OpenStack中的rabbitmq的配置方法 author:headsen chen   2017-10-11  17:24:58 个人原创,允许转载,转载请注明作者,出处,否则依法追究法律责任 ...