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文件上传下载的更多相关文章

  1. Java基础——Servlet(八)文件上传下载

    一.简单的文件上传常见的组件Smartupload , Apache 的 commons FileUploadSmartupload上传的步骤: 1.初始化上传上下文 2.准备上传 3.保存文件 &l ...

  2. Python 基于Python实现Ftp文件上传,下载

    基于Python实现Ftp文件上传,下载   by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ...

  3. 【FTP】FTP文件上传下载-支持断点续传

    Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...

  4. java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题

    //文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String ...

  5. python 实现远端ftp文件上传下载

    python 实现ftp上传下载 * 脚本需要传入两个参数,参数1为需要从远端ftp站点下载文件名称,参数2为已知需要下载的文件md5值,文件下载完成后会自动进行md5值校验 * 运行示例 [root ...

  6. 4.1 - FTP文件上传下载

    题目:开发一个支持多用户同时在线的FTP程序要求:1.用户加密认证2.允许同时多用户登录3.每个用户有自己的家目录,且只能访问自己的家目录4.对用户进行磁盘配额,每个用户的可用空间不同5.允许用户在f ...

  7. ftp文件上传下载命令

    介绍:从本地以用户wasqry登录的机器1*.1**.21.67上通过ftp远程登录到ftp服务器上,登录用户名是lte****,以下为使用该连接做的实验.  查看远程ftp服务器上用户lte**** ...

  8. Java 利用Apache Commons Net 实现 FTP文件上传下载

    package woxingwosu; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ...

  9. FTP文件上传下载

    使用Apache Commons Net来实现FTP服务器文件的上传 与 下载 maven配置Jar <!-- https://mvnrepository.com/artifact/common ...

随机推荐

  1. jQuery UI 之 LigerUI 快速入门

    LigerUI 快速开发UI框架 LigerUI 是基于jQuery 的UI框架,其核心设计目标是快速开发.使用简单.功能强大.轻量级.易扩展.简单而又强大,致力于快速打造Web前端界面解决方案,可以 ...

  2. 上传form表单

    <form name="theForm" method="post" action="index.php?m=back&c=Goods& ...

  3. Android日语输入法Simeji使用示例

    MainActivity如下: package cn.testsimeji; import android.os.Bundle; import android.view.View; import an ...

  4. Ffmpeg和SDL创建线程(转)

    Spawning Threads Overview Last time we added audio support by taking advantage of SDL's audio functi ...

  5. DAT文件怎样打开

    DAT文件类型主要是"数据"文件.能够是不论什么内容,比方:文字,图形,视频或一般的二进制数据,它并没有统一详细的结构.所以您不能理解它也相应一个用来打开它的应用程序.比方你看到一 ...

  6. 并查集+二分-hdu-4750-Count The Pairs

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4750 题目大意: 给一无向图,n个点,m条边,每条边有个长度,且不一样.定义f(i,j)表示从节点i ...

  7. [Redux] Generating Containers with connect() from React Redux (FooterLink)

    Code to be refactored: class FilterLink extends Component { componentDidMount() { const { store } = ...

  8. Unity 进度条3D制作(3D版)

    昨天我们一起学习了2D进度跳的制作,那么趁着我们脑海中还残存昨日的记忆,今天继续学习另一种方法: 实现思路:当鼠标悬浮Start按钮->实例化物体并显示进度->100/100->进入 ...

  9. 转:Xshell显示找不到匹配的outgoing encryption算法怎么办

    原文出处:http://www.xshellcn.com/xsh_column/suanfa-bpp.html 由用户反应在使用xshell和xftp连接debian 7时出现找不到匹配的outgoi ...

  10. mysql命令学习笔记(1):show table status like 'user';显示表的相关信息

    show table status like 'user';显示表的相关信息 +------------+--------+---------+------------+------+-------- ...