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是前台接受的参数
s1=s1.substring(6);
s1=s1.substring(s1.indexOf("/"));
String fn=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=\"" + fn+ "\"");//response文件头中定义的filename包含的中文必须是原始的ISO-8859-1编码。

String filename=new String(fn.getBytes("ISO-8859-1"),"gbk");//程序中要使用的文件名,必须转换为gbk编码

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;
}
时间: 2024-10-11 18:23:27

java/struts/Servlet文件下载与ftp文件下载的相关文章

java实现ftp文件下载的源代码

这几天做的一个项目中用到了ftp文件传输,用java实现了ftp文件的下载. 一.win7下搭建ftp服务器 详见:http://jingyan.baidu.com/article/4b52d7026f50eefc5c774bcc.html 二.用java实现ftp文件下载 使用org.apache.commons.net  jar包,下载地址:http://commons.apache.org/proper/commons-net/download_net.cgi 下载完成后,新建java工程

Gradle之FTP文件下载

Gradle之FTP文件下载 1.背景 项目上需要使用本地web,所以我们直接将web直接放入assets资源文件夹下.但是随着开发进行web包越来越大:所以我们想着从版本库里面去掉web将其忽略掉,使用gradle命令下载web.由于web包是放在局域网服务器上的,服务器支持FTP文件协议,所以使用FTP插件下载文件. 2.FTP FTP官网文档 Gradle官网文档 gradle配置 3.FTP工具 ftp-util.gradle configurations { ftpAntTask }

如何使用Java、Servlet创建二维码

归功于智能手机,QR码逐渐成为主流,它们正变得越来越有用.从候车亭.产品包装.家装卖场.汽车到很多网站,都在自己的网页集成QR码,让人们快速找到它们.随着智能手机的用户量日益增长,二维码的使用正在呈指数上升. 让我们来看看QR码的简要概述,以及如何在Java中生成它们. QR码介绍 QR码(Quick Response 快速响应码)是矩阵条形码(或二维码)的一种类型,最先为于汽车行业而设计.得益于其快速读取性和较大的存储容量,QR码开始在汽车行业以外流行.图案是在白色背景上由有序排列的黑色方块组

(转)如何使用Java、Servlet创建二维码

归功于智能手机,QR码逐渐成为主流,它们正变得越来越有用.从候车亭.产品包装.家装卖场.汽车到很多网站,都在自己的网页集成QR码,让人们快速找到它们.随着智能手机的用户量日益增长,二维码的使用正在呈指数上升. 让我们来看看QR码的简要概述,以及如何在Java中生成它们. QR码介绍 QR码(Quick Response 快速响应码)是矩阵条形码(或二维码)的一种类型,最先为于汽车行业而设计.得益于其快速读取性和较大的存储容量,QR码开始在汽车行业以外流行.图案是在白色背景上由有序排列的黑色方块组

atitit.Atitit. Gui控件and面板-----服务端控件 java struts的实现最佳实践

atitit.Atitit.  Gui控件and面板-----服务端控件 java struts的实现最佳实践 1. 服务器控件的类别 1 1.1. 数据控件:该类控件可细分为两种类型:数据源控件和数据绑定控件. 1 1.2. 站点导航控件: 1 1.3. WebParts控件: 1 1.4. 登录控件: 1 1.5. Ajax 控件 1 2. jsf 2 3. Apache  ecs 2 4. Custom ui control... 2 5. Struts UI Tags display d

Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis

https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=63 https://www.zhihu.com/question/29444491/answer/146457757 1. Java - Struts框架教程Struts 是Apache软件基金会(ASF)赞助的一个开源项目.通过采用JavaServlet/JSP技术,实现了基于Java EEWeb

【Java】Servlet 工作原理解析

Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的基本要求.本文将带你认识 Java Web 技术是如何基于 Servlet 工作,你将知道:以 Tomcat 为例了解 Servlet 容器是如何工作的?一个 Web 工程在 Servlet 容器中是如何启动的? Servlet 容器如何解析你在 web.xml 中定义的 Servlet ?用户的请

java Struts+Hibernate企业人力资源管理系统源代码下载

原文:java Struts+Hibernate企业人力资源管理系统源代码下载 源代码下载地址:http://www.zuidaima.com/share/1778471692995584.htm 一个简单的人才管理系统 人力资源管理在管理学中是一个非常重要的领域,通过人力资源管理能够对企业员工进行有效的管理.它的作用已经大大超过了人事管理,正因为如此,这种新型的 管理模式越来越被人们所重视到.有效的人力资源管理是社会各组织.各企业都需要的.在本章将一个Web版的人力资源管理系统,通过该系统对企

Ed Burns谈HTTP/2和Java EE Servlet 4规范

在2015年JavaLand大会上,Ed Burns展示了Java EE Servlet 4.0规范(JSR 369)的概要,演讲的重点在于Java EE平台对HTTP/2的支持.HTTP/2旨在解决现存HTTP规范中的问题,并引入新的功能,包括request/response多路复用.二进制帧传输(binary framing).数据流优先级.服务器推送和头信息压缩. Burns是Oracle公司的技术顾问之一,他从由于HTTP/1.1中固有的缺陷,导致当前典型网站的30多种资源传输到浏览器端