设为首页 收藏本站
查看: 932|回复: 0

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

[复制链接]

尚未签到

发表于 2015-5-27 11:19:23 | 显示全部楼层 |阅读模式

  我在百度知道里曾提问了本问题,现把我的问题摘录如下:
  我现在用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;   
         http://www.iyunv.com/sishierfei/admin/ftp://ftp.connect(ip/, port);
         //下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件
         http://www.iyunv.com/sishierfei/admin/ftp://ftp.setcontrolencoding(%22gbk/");
         FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);   
         conf.setServerLanguageCode("zh");
        
         //如果采用默认端口,可以使用http://www.iyunv.com/sishierfei/admin/ftp://ftp.connect(url/)的方式直接连接FTP服务器   
         http://www.iyunv.com/sishierfei/admin/ftp://ftp.login(username/, password);//登录   
         reply = http://www.iyunv.com/sishierfei/admin/ftp://ftp.getreplycode/();   
         if (!FTPReply.isPositiveCompletion(reply)) {   
             http://www.iyunv.com/sishierfei/admin/ftp://ftp.disconnect/();   
             return success;   
         }   
         
         
         http://www.iyunv.com/sishierfei/admin/ftp://ftp.changeworkingdirectory(remotepath);//转移到FTP服务器目录   
         FTPFile[] fs = http://www.iyunv.com/sishierfei/admin/ftp://ftp.listfiles/();   
         
         for(int i = 0; i < fs.length; i++){
         FTPFile ff = fs;
             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
                 http://www.iyunv.com/sishierfei/admin/ftp://ftp.retrievefile(new/ String(ff.getName().getBytes("GBK"),"ISO-8859-1"), is);   
                 is.close();   
             }   
         }   
            
         http://www.iyunv.com/sishierfei/admin/ftp://ftp.logout/();   
         success = true;   
     } catch (IOException e) {   
         e.printStackTrace();   
     } finally {   
         if (http://www.iyunv.com/sishierfei/admin/ftp://ftp.isconnected/()) {   
             try {   
                 http://www.iyunv.com/sishierfei/admin/ftp://ftp.disconnect/();   
             } catch (IOException ioe) {   
             }   
         }   
     }   
     return success;   
}
  public static void main(String[] args) {
   // TODO Auto-generated method stub
  http://www.iyunv.com/sishierfei/admin/ftp://ftp.downfile(%2210.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;   
         http://www.iyunv.com/sishierfei/admin/ftp://ftp.connect(ip/, port);
         //下面三行代码必须要,而且不能改变编码格式
         http://www.iyunv.com/sishierfei/admin/ftp://ftp.setcontrolencoding(%22gbk/");
         FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);   
         conf.setServerLanguageCode("zh");
        
         //如果采用默认端口,可以使用http://www.iyunv.com/sishierfei/admin/ftp://ftp.connect(url/)的方式直接连接FTP服务器   
         http://www.iyunv.com/sishierfei/admin/ftp://ftp.login(username/, password);//登录   
         reply = http://www.iyunv.com/sishierfei/admin/ftp://ftp.getreplycode/();   
         if (!FTPReply.isPositiveCompletion(reply)) {   
             http://www.iyunv.com/sishierfei/admin/ftp://ftp.disconnect/();   
             return success;   
         }   
         
         
         http://www.iyunv.com/sishierfei/admin/ftp://ftp.changeworkingdirectory(remotepath);//转移到FTP服务器目录   
         FTPFile[] fs = http://www.iyunv.com/sishierfei/admin/ftp://ftp.listfiles/();   
         
         for(int i = 0; i < fs.length; i++){
         FTPFile ff = fs;
             if(ff.getName().equals(fileName)){
            
             String filename = fileName;
                 //这个就就是弹出下载对话框的关键代码
                 response.setHeader("Content-disposition",
                                    "attachment;filename=" +
                                    URLEncoder.encode(filename, "utf-8"));
                 //将文件保存到输出流outputStream中
                 http://www.iyunv.com/sishierfei/admin/ftp://ftp.retrievefile(new/ String(ff.getName().getBytes("GBK"),"ISO-8859-1"), outputStream);
                 outputStream.flush();
                 outputStream.close();
             }   
         }   
            
         http://www.iyunv.com/sishierfei/admin/ftp://ftp.logout/();   
         success = true;   
     } catch (IOException e) {   
         e.printStackTrace();   
     } finally {   
         if (http://www.iyunv.com/sishierfei/admin/ftp://ftp.isconnected/()) {   
             try {   
                 http://www.iyunv.com/sishierfei/admin/ftp://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用了这个版本比较老的。
  
  引用地址:http://hi.baidu.com/renliangli/blog/item/6ccb6b3a049d95c9d46225a5.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-71194-1-1.html 上篇帖子: 如何设置IIS FTP的设置主动模式还是被动模式? 下篇帖子: 【转载】C#如何操控FTP,获取FTP文件或文件夹列表,获取FTP文件大小,FTP上传,FTP删除文件,FTP新建文件夹、删除文件夹
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表