java/struts/Servlet文件下载与ftp文件上传下载
1.前端代码
使用超链接到Struts的Action或Servlet
<a target="_blank" href="ftpFileAction!downloadFile.action?transUrl=ftp://10.0.2.1/tazi/a.xml">请点击下载</a>
2.后台代码 Action或Servlet
String s1=transUrl; // transUrl是前台接受的参数,get接受的参数tomcat一律使用iso-8859-1编码
transUrl=new String(transUrl.getBytes("ISO-8859-1"),"utf-8");//程序中要使用的文件名,必须转换为gbk编码
s1=s1.substring(6);
s1=s1.substring(s1.indexOf("/"));
String filename=s1.substring(s1.lastIndexOf("/")+1);
String filepath=s1.substring(0,s1.lastIndexOf("/"));
response.setCharacterEncoding("gbk");
response.setContentType("application/octet-stream");                
response.addHeader("Content-Disposition", "attachment;filename=\"" + new String(filename.getBytes("gbk"),"ISO-8859-1")+ "\"");//response文件头中定义的filename包含的中文必须是原始的ISO-8859-1编码。
boolean suc=false;
suc=downFileStream("10.0.2.1", 21,"myUser","myPwd", 
                        filepath, filename, os);//downFileStream是一个下载ftp文件到文件流的方法
if(!suc){
    response.reset();
    response.setCharacterEncoding("gbk");
    PrintWriter writer=new PrintWriter(os);
    writer.write("指定的文件不存在!");
    writer.close();
}else{
    os.close();
};
3.ftp文件下载处理
注意这里引入的包是
org.apache.commons.net.ftp.*
(1).下载到本地
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply; public static boolean downFile(String url, // FTP服务器hostname
int port,// FTP服务器端口
String username, // FTP登录账号
String password, // FTP登录密码
String remotePath,// FTP服务器上的相对路径
String fileName,// 要下载的文件名
String localPath// 下载后保存到本地的路径
) {
boolean success = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(url, port);
// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
FTPFile[] fs = ftp.listFiles();
boolean ftpFileExist=false;
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
ftpFileExist=true;
File dir = new File(localPath);
if(!dir.exists()){
dir.mkdirs();
}
File localFile = new File(localPath + File.separator + ff.getName());
OutputStream is = new FileOutputStream(localFile,true);
ftp.setBufferSize(1024);
if(ftp.setFileType(FTP.BINARY_FILE_TYPE)){
ftp.retrieveFile(ff.getName(), is);
is.close();
}
}
}
ftp.logout();
if(ftpFileExist){
success = true;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
(2).下载到文件输出流 OutputStream
public static boolean downFileStream(String url, // FTP服务器hostname
int port,// FTP服务器端口
String username, // FTP登录账号
String password, // FTP登录密码
String remotePath,// FTP服务器上的相对路径
String fileName,// 要下载的文件名
OutputStream os
) {
boolean success = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(url, port);
// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return false;
}
ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
FTPFile[] fs = ftp.listFiles();
boolean ftpFileExist=false;
for (FTPFile ff : fs) {
String ffName=new String(ff.getName().getBytes("ISO-8859-1"),"gbk");
if (ffName.equals(fileName)) {
ftpFileExist=true;
ftp.setBufferSize(1024);
if(ftp.setFileType(FTP.BINARY_FILE_TYPE)){
ftp.retrieveFile(ff.getName(), os);
}
}
}
ftp.logout();
if(ftpFileExist){
success = true;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
4.ftp文件上传
public static boolean uploadFile(String url,// FTP服务器hostname
int port,// FTP服务器端口
String username, // FTP登录账号
String password, // FTP登录密码
String path, // FTP服务器保存目录
String filename, // 上传到FTP服务器上的文件名
InputStream input // 输入流
) {
boolean success = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(url, port);// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
ftp.changeWorkingDirectory(path);
ftp.storeFile(filename, input); input.close();
ftp.logout();
success = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
上传时中文名处理,要转换为
ISO-8859-1编码
public static void main(String[] args) throws Exception{
        FtpUtil f= new FtpUtil();
        File file=new File("D:/测试.xml");
        InputStream isInputStream=new FileInputStream(file);
        String filename=new String("中文.xml".getBytes("gbk"),"ISO-8859-1");
        f.uploadFile("10.7.0.15", 21, "dd", "dd", "/tazi",
                filename, isInputStream);
    }
java/struts/Servlet文件下载与ftp文件上传下载的更多相关文章
- Java基础——Servlet(八)文件上传下载
		一.简单的文件上传常见的组件Smartupload , Apache 的 commons FileUploadSmartupload上传的步骤: 1.初始化上传上下文 2.准备上传 3.保存文件 &l ... 
- Python 基于Python实现Ftp文件上传,下载
		基于Python实现Ftp文件上传,下载 by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ... 
- 【FTP】FTP文件上传下载-支持断点续传
		Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ... 
- java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题
		//文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String ... 
- python 实现远端ftp文件上传下载
		python 实现ftp上传下载 * 脚本需要传入两个参数,参数1为需要从远端ftp站点下载文件名称,参数2为已知需要下载的文件md5值,文件下载完成后会自动进行md5值校验 * 运行示例 [root ... 
- 4.1 - FTP文件上传下载
		题目:开发一个支持多用户同时在线的FTP程序要求:1.用户加密认证2.允许同时多用户登录3.每个用户有自己的家目录,且只能访问自己的家目录4.对用户进行磁盘配额,每个用户的可用空间不同5.允许用户在f ... 
- ftp文件上传下载命令
		介绍:从本地以用户wasqry登录的机器1*.1**.21.67上通过ftp远程登录到ftp服务器上,登录用户名是lte****,以下为使用该连接做的实验. 查看远程ftp服务器上用户lte**** ... 
- Java 利用Apache Commons Net 实现 FTP文件上传下载
		package woxingwosu; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ... 
- FTP文件上传下载
		使用Apache Commons Net来实现FTP服务器文件的上传 与 下载 maven配置Jar <!-- https://mvnrepository.com/artifact/common ... 
随机推荐
- Implement Queue using Stacks 解答
			Question Implement the following operations of a queue using stacks. push(x) -- Push element x to th ... 
- Zookeeper 5、Zookeeper应用场景
			应用场景1 .统一命名服务 » 分布式应用中,通常需要有一套完整的命名规则,既能够产生唯一的名称又便于人识别和记住,通常情况 下用树形的名称结构是一个理想的选择,树形的名称结构是一个有层次的目录结构, ... 
- jQuery 局部div刷新和全局刷新方法
			div的局部刷新 $(".dl").load(location.href+".dl"); 全页面的刷新方法 window.location.reload( ) ... 
- Atom编辑器
			Atom介绍 Github的员工Nathan Sobo在Atom的博客中提到:”Sublime和TextMate十分方便,但是扩展性不足:另一方面,Emacs和 Vim扩展性很强却需要学习日程工作中很 ... 
- MySQL整数类型说明 int(11) vs int(20)
			整数类型后面跟的是显示的宽度.M指示最大显示宽度.最大有效显示宽度是255.显示宽度与存储大小或类型包含的值的范围无关. 实践出真知: mysql> create table test2 ( a ... 
- android 数据存储之SharePreference 的几种方式
			1. 常见的 getSharedPreferences(String filename,mode) 指定sp文件的名称,生成的文件名为 filename.xml 2.getPreferences(mo ... 
- c# 面相对象1-概括
			面向对象和面向过程的区别 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为 ... 
- PHP学习笔记六【方法-递归】
			<?php //递归 global $n;//定义全局变量 function abc($n) { if($n>2) { abc(--$n); } echo '$n='.$n.'<br ... 
- JQ动画 show hide
			<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... 
- 转载-SQL不同服务器数据库之间的数据操作整理(完整版) .
			---------------------------------------------------------------------------------- -- Author : htl25 ... 
