`

ftp文件上传下载工具类及用法

阅读更多

弄了一天的ftp文件上传下载,最棘手的有两个问题:

1、上传中文文件在ftp服务器(linux)上的乱码问题;

2、总是提示这个错误:java.net.SocketException: Software caused connection abort: recv failed

 

对于第二个问题大家可以上网找找,大部分说的是出现这个问题的原因,并没有说怎么解决。也希望哪位大神留言帮忙解决那是感激不尽啊!

 

我的实现方法就是:不把自己撞在南墙上,换一条道走,诶!两个问题都解决了!(附件是必须的jar包)

这个工具类总结了网上很多种方法,只需要引入一个jar包,不像其他的demo需要2--3个jar包。个人觉得还是很方便的。

 

工具类代码如下:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.net.URLEncoder;
import java.util.Properties;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
/** 
 * CopyRright (c)2012-2013:   
 * Project:  nankai                                       
 * Module ID: FTPUtils
 * Comments:                                             
 * JDK version used:      JDK1.7                              
 * Author:                     
 * Create Date:  2013-9-18 
 * Modified By:                                           
 * Modified Date:                                      
 * Why & What is modified      
 * Version: 1.0                       
 */

public class FTPUtils {
	
	//读取配置文件中的系统ip和port
	private static Properties p = new PropertiesLoader("classpath:/application.development.properties", "classpath:/application.properties")
	.getProperties();
	
	private static String ftpIp = p.getProperty("ftp.ip"); // 服务器ip
	
    private static int ftpPort = Integer.parseInt(p.getProperty("ftp.port")); // 服务器端口号

    private static String userName = p.getProperty("ftp.username"); // 登录服务器用户名

    private static String password = p.getProperty("ftp.password"); // 登录服务器密码

//    protected CustomFtpClient ftpClient = null;

//    OutputStream os = null;

//    FileInputStream is = null;
	
    /**
	 * Description: 向FTP服务器上传文件
	 * 
	 * @param path
	 *            FTP服务器保存目录
	 * @param filename
	 *            上传到FTP服务器上的文件名
	 * @param input
	 *            输入流
	 * @return 成功返回true,否则返回false
     * @throws IOException 
     * @throws SocketException 
	 */
    public static boolean uploadFile(String path, String filename, InputStream input) throws SocketException, IOException {
    	boolean success = false;  
        FTPClient ftp = new FTPClient();  
        ftp.connect(ftpIp, ftpPort);// 连接FTP服务器  
        int reply;  
        // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器  
        ftp.login(userName, password);// 登录  
        // 设置PassiveMode传输  
        ftp.enterLocalPassiveMode();  
        // 设置以二进制流的方式传输  
        ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);  
        ftp.setFileType(FTP.BINARY_FILE_TYPE);  
        reply = ftp.getReplyCode();  
        if (!FTPReply.isPositiveCompletion(reply)) {  
            ftp.disconnect();  
			return success;
        }  
        String filename1 = new String(filename.getBytes("GBK"), "ISO-8859-1");
		String path1 = new String(path.getBytes("GBK"), "ISO-8859-1");
        boolean isChangeWork = ftp.changeWorkingDirectory(path1);  
        if (!isChangeWork) {  
            boolean isMade = ftp.makeDirectory(path1);  
            if (!isMade) {  
                throw new IOException("ftp上传文件创建目录失败");  
            }  
            isChangeWork = ftp.changeWorkingDirectory(path1);  
        }  
        ftp.storeFile(filename1, input);  
        ftp.logout();  
        success = true;  
        if (ftp.isConnected()) {  
            try {  
                ftp.disconnect();  
            } catch (IOException ioe) {  
            }  
        }  
        return success;  
	}
    
    /**
	 * Description: 从FTP服务器下载文件
	 * 
	 * @param remotePath
	 *            FTP服务器上的相对路径
	 * @param fileName
	 *            要下载的文件名
	 * @param localPath
	 *            下载后保存到本地的路径
	 * @return
     * @throws IOException 
     * @throws SocketException 
	 */
	public static boolean downloadFile(String path, String fileName, OutputStream outputStream) throws SocketException, IOException {
		boolean success = false;  
        FTPClient ftp = new FTPClient();  
        ftp.connect(ftpIp, ftpPort);// 连接FTP服务器  
        int reply;  
        // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器  
        ftp.login(userName, password);// 登录  
        // 设置PassiveMode传输  
        ftp.enterLocalPassiveMode();  
        // 设置以二进制流的方式传输  
        ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);  
        ftp.setFileType(FTP.BINARY_FILE_TYPE);  
        reply = ftp.getReplyCode();  
        if (!FTPReply.isPositiveCompletion(reply)) {  
            ftp.disconnect();  
        }  
        String filename1 = new String(fileName.getBytes("GBK"), "ISO-8859-1");
		String path1 = new String(path.getBytes("GBK"), "ISO-8859-1");
        boolean isChangeWork = ftp.changeWorkingDirectory(path1);  
        if (!isChangeWork) {  
            throw new IOException("ftp目录不存在");  
        }  
        InputStream input = ftp.retrieveFileStream(filename1);  
        int buf = -1;  
        while ((buf = input.read()) != -1) {  
        	outputStream.write(buf);  
        }  
        outputStream.flush();  
        input.close();  
        ftp.logout();  
        if (ftp.isConnected()) {  
            try {  
                ftp.disconnect();  
            } catch (IOException ioe) {  
            }  
        }  
        return success;  
    }  
    
}

 

使用方法:

上传直接通过FTPUtils.uploadFile(ftpPath, materialName, input);就可以

下载(以springmvc为例子):

@RequestMapping("download")
	public void download(HttpServletResponse response, String materialName, Model model) throws IOException {
		response.setContentType("application/x-download");
		//给用户提供的下载文件名,处理乱码问题
		String filedisplay = URLEncoder.encode(materialName, "UTF-8");
		response.addHeader("Content-Disposition", "attachment;filename=" + filedisplay);
		OutputStream outputStream = response.getOutputStream();
		String remotePath = "/material/2013/";
		FTPUtils.downloadFile(remotePath, materialName, outputStream);
	}

会将文件下载到本地。

注意:在设置Content-Disposition头字段之前,一定要设置Content-Type头字段。当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。

 

最后,希望大家有谁发现这里有不合适或者需要改进的地方,请留言与我联系,共享万岁!

1
0
分享到:
评论

相关推荐

    ftp常用方法汇总,支持流上传,文件上传,下载,删除各类方法

    ftp常用方法汇总,支持流上传,文件上传,下载,删除各类方法,使用时候秩序new FtpUtils(),压入对应的ftp连接参数即可调用相应参数。

    文件的上传和下载帮助类C#实现

    文件上传和下载是常见的网络操作,以下是几种常用的方法: 文件上传: 1. 网页表单:使用HTML表单元素,通过POST或者PUT请求将文件发送到后端服务器。后端服务器接收文件并处理保存。 2. API接口:通过HTTP请求...

    匿名 ftp 下载

    即使有些匿名FTP主机确实允许用户上传文件,用户也只能将文件上传至某一指定上传目录中。随后,系统管理员会去检查这些文件,他会将这些文件移至另一个公共下载目录中,供其他用户下载,利用这种方式,远程主机的...

    PowerTCP FTP Tool – 适用于FTP服务器上传和下载的控件

    · 包含MPUT和MGET方法,用来上传/下载多个文件——甚至整个目录树,而且只需要一行代码。 · 支持 COM+ Component Services。 · 可用于多线程的环境。 · 可用于事件驱动的和脚本编写的(模块化)应用程序。 ...

    详解JAVA中使用FTPClient工具类上传下载

    主要介绍了JAVA中使用FTPClient工具类上传下载的相关资料,java 使用FTP服务器上传文件、下载文件,需要的朋友可以参考下

    java common FTPClient ftp sftp

    ②快速知道如何使用java操作ftp文件,避免踩坑,多种操作方式。③ftp文件到底可如何操作。如何获取,如何上传。 阅读建议:此资源以让工作中的同学快速学习使用,直接复制代码即可直接使用,不需要太多改造,当然也...

    xlight ftp服务器

    xferlog的支持 - 支持UNIX下FTP文件传输xferlog格式的日志,能够直接被如AWStats之类的流量统计工具使用。 MODE Z 支持 - 支持数据传输的实时压缩。 反盗链保护功能 - FTP服务器能够提供反盗链保护功能。

    SpringMVC基础上的web框架

    版本管理,服务根路径工具类,文件上传工具类 1.0.10 集成ueditor在线编辑器 1.0.11 地址联动 1.0.12 Excel工具类 Word工具类 Java NIO实现socket工具类 分布式session jdk升级到1.7 嵌入式redis服务(只支持linux) ...

    commons-net-3.6.zip

    ftp上传下载文件使用jar包和工具类,有测试使用方法可以进行测试,没有问题。放心用。

    C#基类库(苏飞版)

    FTPClient--FTP操作帮助类,FTP上传,FTP下载,FTP文件操作,FTP目录操作 FTPHelper FTPHelper-FTP帮助类,FTP常用操作方法,添加文件,删除文件等 FTPOperater FTP操作帮助类,方法比较多,比较实用 6.JS操作...

    C#基类库大全下载--苏飞版

    FTPClient--FTP操作帮助类,FTP上传,FTP下载,FTP文件操作,FTP目录操作 FTPHelper FTPHelper-FTP帮助类,FTP常用操作方法,添加文件,删除文件等 FTPOperater FTP操作帮助类,方法比较多,比较实用 6.JS操作...

    JAVA上百实例源码以及开源项目

    ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地...

    apache-commons源码及jar文件

    FileUpload 使得在你可以在应用和Servlet中容易的加入强大和高性能的文件上传能力 HttpClient Commons-HttpClient 提供了可以工作于HTTP协议客户端的一个框架. IO IO 是一个 I/O 工具集 Jelly Jelly是一个基于 ...

    EditPlus 2整理信箱的工具

    作者主页有很多语法自动完成文件下载,地址 http://editplus.com/files.html 【14】工具集成——编译器集成例子(Java、Borland C++、Visual C++、Inno Setup、nsis) 在“工具→参数选择→用户工具”选项页设置,...

    java源码包---java 源码 大量 实例

    ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地...

    Editplus 3[1].0

    作者主页有很多语法自动完成文件下载,地址 http://editplus.com/files.html 【14】工具集成——编译器集成例子(Java、Borland C++、Visual C++、Inno Setup、nsis) 在“工具→参数选择→用户工具”选项页设置,...

    java源码包4

    ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...

    cmd操作命令和linux命令大全收集

    ftp ip 端口 用于上传文件至服务器或进行文件操作,默认端口为21。bin指用二进制方式传送(可执行文件进);默认为ASCII格式传送(文本文件时) route print 显示出IP路由,将主要显示网络地址Network addres,子网...

    editplus 代码编辑器html c++ jsp css

    如果你使用 EditPlus 进行文本编辑,那么每次创建文本文件,编辑后保存时,尽管文件类型下拉列表中显示的是文本文件, EditPlus 还是询问你是否添加".txt"后缀,是不是很烦? 解决方法: ① 在程序目录建立一个空的...

Global site tag (gtag.js) - Google Analytics