`
yjshengshe
  • 浏览: 204603 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

利用ftpclient下载文件 ,解决window.open不能下载txt文件和中文问题

阅读更多

我现在用JavaScript的window.open('url'),其中url是ftp地址并且地址中含有中文,运行的时候不能下载该ftp地址下的文件,例如:ftp://test:test@10.32.166.144/flashfxp/激活码.txt 但是如果地址是全英文的话就能下载,另外,文件是存在aix系统上,并且系统支持中文。
希望知道是高手赐教下啊!

现在就来看下我解决的代码吧,希望对遇到同样问题的人有点帮助。

1)把ftp地址中的文件保存到本地的java类源码:

package test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

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;

public class Ftp {

/**
* Description: 从FTP服务器下载文件
* @param ip FTP服务器的ip地址
* @param port FTP服务器端口,默认为:21
* @param username FTP登录账号
* @param password FTP登录密码
* @param remotePath FTP服务器上的相对路径
* @param fileName 要下载的文件名
* @param localPath 下载后保存到本地的路径
* @return
*/
public static boolean downFile(String ip, int port,String username, String password, String remotePath,String fileName,String localPath) {  
     boolean success = false;  
     FTPClient ftp = new FTPClient();  
     try {  
         int reply;  
         ftp.connect(ip, port);
         //下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件
         ftp.setControlEncoding("GBK");
         FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);  
         conf.setServerLanguageCode("zh");
       
         //如果采用默认端口,可以使用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();  
        
         for(int i = 0; i < fs.length; i++){
         FTPFile ff = fs[i];
             if(ff.getName().equals(fileName)){  
            
                 File localFile = new File(localPath+File.separator+ff.getName());  
//                   
                 OutputStream is = new FileOutputStream(localFile);  
                
                 //注意此处retrieveFile的第一个参数由GBK转为ISO-8859-1编码。否则下载后的文件内容为空。
                 //原因可能是由于aix系统默认的编码为ISO-8859-1
                 ftp.retrieveFile(new String(ff.getName().getBytes("GBK"),"ISO-8859-1"), is);  
                 is.close();  
             }  
         }  
           
         ftp.logout();  
         success = true;  
     } catch (IOException e) {  
         e.printStackTrace();  
     } finally {  
         if (ftp.isConnected()) {  
             try {  
                 ftp.disconnect();  
             } catch (IOException ioe) {  
             }  
         }  
     }  
     return success;  
}

public static void main(String[] args) {
   // TODO Auto-generated method stub
  Ftp.downFile("10.32.166.144", 21, "test", "test", "/flashfxp", "激活码.txt", "C:");
   try {
    String string = new String("激活码".getBytes("utf-8"),"utf-8");
    System.out.println(string);
   } catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  
}

}


2)将ftp资源以文件流的方式打开,由用户决定保存在本地何处,程序运行后可以从IE跳出框中打开或者保存的Action代码,利用Struts1写的:

/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.mocha.test;


import java.io.IOException;

import java.io.OutputStream;

import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;


public class DownloadAction extends Action{

    /** *//**
     * Method execute
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws IOException
     */
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) throws IOException{

       
        OutputStream os=null;
            try {
               
                os = response.getOutputStream();
               
                response.reset();       
               
                downFile("10.32.166.144", 21, "test", "test", "/flashfxp", "激活码.txt",os,response);
                //downFile(ip, 21,ftp_user,ftp_pwd,remotePath, filename,os,response);
              
            } catch (IOException e){
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                try{
                    os.close();
                   
                } catch (IOException e){
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
               
            }
        return null;

    }
   

   
/**
* Description: 从FTP服务器下载文件
* @param ip FTP服务器ip地址
* @param port FTP服务器端口,默认为21
* @param username FTP登录账号
* @param password FTP登录密码
* @param remotePath 附件在FTP服务器上的绝对路径
* @param fileName 要下载的文件名
* @param outputStream 输出流
* @param response
* @return
*/
public static boolean downFile(String ip, int port,String username, String password, String remotePath
    ,String fileName,OutputStream outputStream,HttpServletResponse response) {  
     boolean success = false;  
     FTPClient ftp = new FTPClient();  
     try {  
         int reply;  
         ftp.connect(ip, port);
         //下面三行代码必须要,而且不能改变编码格式
         ftp.setControlEncoding("GBK");
         FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);  
         conf.setServerLanguageCode("zh");
       
         //如果采用默认端口,可以使用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();  
        
         for(int i = 0; i < fs.length; i++){
         FTPFile ff = fs[i];
             if(ff.getName().equals(fileName)){
            
             String filename = fileName;
                 //这个就就是弹出下载对话框的关键代码
                 response.setHeader("Content-disposition",
                                    "attachment;filename=" +
                                    URLEncoder.encode(filename, "utf-8"));
                 //将文件保存到输出流outputStream中
                 ftp.retrieveFile(new String(ff.getName().getBytes("GBK"),"ISO-8859-1"), outputStream);
                 outputStream.flush();
                 outputStream.close();
             }  
         }  
           
         ftp.logout();  
         success = true;  
     } catch (IOException e) {  
         e.printStackTrace();  
     } finally {  
         if (ftp.isConnected()) {  
             try {  
                 ftp.disconnect();  
             } catch (IOException ioe) {  
             }  
         }  
     }  
     return success;  
}
}

差点忘了利用ftpclient要用到的jar包了,呵呵,就这两个了:commons-net-1.4.1.jar、jakarta-oro- 2.0.8.jar

对了我用的jdk是1.4的。所以commons-net-1.4.1.jar用了这个版本比较老的。

分享到:
评论

相关推荐

    利用ftpclient下载文件,解决用window.open打开ftp地址中有中文,不能下载的问题

    本文将详细探讨如何使用Java中的`FTPClient`库来下载包含中文的文件,并解决使用`window.open`方法打开包含中文的FTP地址无法下载文件的问题。 #### 问题背景 通常情况下,开发者会尝试通过浏览器提供的`window....

    用org.apache.commons.net.ftp.FTPClient包实现简单文件下载

    在本文中,我们将深入探讨如何使用`org.apache.commons.net.ftp.FTPClient`包来实现简单的文件下载功能。这个过程涉及到几个关键步骤,包括连接到FTP服务器、登录、设置传输模式、下载文件以及断开连接。 首先,你...

    java利用FTPClient实现上传下载文件.doc

    Java 中使用 FTPClient 实现上传下载文件是 Java 程序中经常需要和 FTP 打交道的重要内容。FTPClient 是 Jakarta Commons 中的一个工具类,位于 Commons Net 包中。FTPClient 提供了上传、下载、删除、创建目录等...

    sun.FtpClient,ftp4j.FTPClient,apache.FTPClient不同的方式操作FTP

    sun.net.ftp.FtpClient,it.sauronsoftware.ftp4j.FTPClient,org.apache.commons.net.ftp.FTPClient三种不同的方式操作FTP

    使用FTPClient实现文件的上传下载

    这篇博客“使用FTPClient实现文件的上传下载”显然关注的是如何利用编程接口FTPClient来执行FTP操作,如上传和下载文件。FTPClient是Apache Commons Net库的一部分,它为Java开发者提供了方便的API来实现FTP功能。 ...

    ftpclient 文件上传、下载、删除

    FTP(File Transfer Protocol)是一种广泛使用的网络协议,用于在互联网上进行文件传输。FTPClient是Java中实现FTP功能的一个库,它提供了丰富的API,...记得在实际使用中,根据实际的服务器信息和文件路径调整代码。

    org.apache.commons.net.ftp.FTPClient包

    org.apache.commons.net.ftp.FTPClient包,不错,在实际项目和产品中使用过。

    PyPI 官网下载 | ftpclient-0.1.tar.gz

    《PyPI官网下载:ftpclient-0.1.tar.gz——深入了解Python FTP客户端库》...在下载并安装`ftpclient-0.1.tar.gz`后,你可以根据文档或源码了解其具体用法,并将其整合到你的Python项目中,提升文件传输的效率和便捷性。

    FTPClient.listFiles()获取文件为空的问题.

    //由于apache不支持中文语言环境,通过定制类解析中文日期类型 ftpClient.configure(new FTPClientConfig("com.zznode.tnms.ra.c11n.nj.resource.ftp.UnixFTPEntryParser")); FTPFile[] files = ftpClient.list...

    System.Net.FtpClient

    例如,可以通过`Connect`方法建立连接,`Login`方法进行身份验证,然后利用`UploadFile`或`DownloadFile`进行文件的上传和下载。同时,`ChangeWorkingDirectory`用于切换当前工作目录,`CreateDirectory`和`Remove...

    System.Net.FtpClient.dll

    C#的FTP操作类库,支持FTP文件的上传,下载等等,封装好的可直接引用FtpClient; 如果自己单枪匹马写一个连接ftp服务器代码那是相当恐怖的(socket通信),有一个评价较高的dll库可以供我们使用。 那就是System...

    com.enterprisedt.net.ftp.FTPClient所需的JAR(edtftpj.jar)

    - **断点续传**:利用`FTPClient.setRestartOffset(offset)`和`FTPClient.setFileType(BINARY_FILE_TYPE)`支持从上次中断的位置继续上传或下载。 - **关闭连接**:完成操作后,记得调用`FTPClient.disconnect()`关闭...

    JAVA中使用FTPClient上传下载.doc

    在Java程序中,使用FTPClient可以方便地实现文件的上传和下载。 2. **FTP文件上传**: - 首先,通过`FTPClient.connect()`方法建立与FTP服务器的连接。连接时可以指定主机名(URL)和端口号。默认FTP端口是21,如果...

    使用FTPClient实现ftp文件上传

    在本文中,我们将深入探讨如何使用FTPClient来实现FTP文件上传,特别是处理中文文件名的上传问题。 FTP是一种广泛使用的互联网协议,允许用户在两台计算机之间传输文件。在Java中,我们可以利用Apache Commons Net...

    使用commons.net FTP 和sun.net.ftp.FtpClient 多种方式上传下载(包括批量)删除功能(一)

    在本文中,我们将深入探讨如何使用Apache Commons Net库和Java内置的`sun.net.ftp.FtpClient`来实现FTP(文件传输协议)的功能,包括上传、下载、批量操作以及删除文件。这两个库提供了丰富的API,使得在Java应用...

    java FTPClient 文件上传下载文件

    对于Java开发者来说,利用Java的FTPClient进行文件的上传和下载是常见的需求之一。本篇文章将围绕如何使用Java中的`FTPClient`库来实现文件的上传与下载操作展开详细介绍。 #### 二、Java FTPClient 库介绍 `...

    FTPClient.zip FTPServer.zip

    FTPClient与FTPServer之间的交互涉及许多命令和响应,如USER和PASS用于身份验证,CWD和PWD用于改变和查看当前工作目录,LIST和NLST用于获取目录列表,PUT和GET用于上传和下载文件,以及DELE和RMD用于删除文件和目录...

    org.apache.commons.net.ftp.FTPClient FTP工具类,实现上传、下载、压缩到输出流下载等功能

    org.apache.commons.net.ftp.FTPClient FTP工具类,实现上传、下载、压缩到输出流下载等功能

    解决ftpClient.listFiles()结果为空的问题

    CentOS某些版本中,JAVA代码执行ftpClient.listFiles()有时结果为空。本项目解决了这个问题。具体代码思路可以参考博客:http://blog.csdn.net/yingprince/article/details/51275956

Global site tag (gtag.js) - Google Analytics