`
java-cn
  • 浏览: 121514 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ftp实现附件上传

 
阅读更多

开发项目时经常遇到有附件上传的功能需求,一开始是将附件作为大对象保存到数据库中。但是发现如果附件量大的话会给数据库存储带来压力,且每次移植时大对象很麻烦。后来就尝试着将在应用服务器指定一个文件夹用来保存每次上传的附件文件,但这种做法也有一个缺点每次重新部署时都需要将该文件夹复制出来,以防止被覆盖。经常一不下心就把文件给覆盖掉了,那种感觉是欲哭无泪啊。

最近在网上找到一种解决办法:用tomcat的虚拟路径+ftp来实现文件上传到非应用服务器目录下。

一、设置tomcat虚拟目录

设置tomcat的虚拟目录有两种实现的方式:

(1).修改${tomcat_home}\conf\server.xml文件。

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

后面添加

<Context path="/aa" docBase="E:\aa" debug="0"  reloadable="true" crossContext="true"></Context>

其中path是指你可以访问的映射名称,docBase指映射的路径。改完后记得重启tomcat

(2).不修改server.xml文件,在conf目录下建立catalina\localhost\aa.xml。aa.xml中文件内容如下:

<Context path="/aa" reloadable="true" docBase="E:\aa" />

 注意:其中path的名称必须和文件名称一致

 

二、安装ftp工具(可以选择windows自带的iis,本人用的是server-U)

安装server-U的过程不再赘述,安装完成后设置域、用户并为用户指定ftp目录(需指定为上面设置的tomcat虚拟目录)。注意开启ftp的被动连接模式,因为在服务器上有防火墙或其他的软件的话主动连接模式是上传不了文件导致一直在等待的状态。被动连接模式在"域详细信息》监听器"目录下设置,见下图(附件1)

 

三、编写附件上传代码

 

public class FtpUploadUtil {

 private final Log log = LogFactory.getLog(this.getClass());
 private static FtpUploadUtil ftpUploadUtil = null;
 private final static String IP = ConfigAccess.init().findProp("ftp_ip");
 private final static int PORT = Integer.parseInt(ConfigAccess.init().findProp("ftp_port"));
 private final static String USERNAME = ConfigAccess.init().findProp("ftp_username");
 private final static String PASSWORD = ConfigAccess.init().findProp("ftp_password");
 
 
 public synchronized static FtpUploadUtil init() {
  if(ftpUploadUtil == null){
   ftpUploadUtil = new FtpUploadUtil();
  }
  return ftpUploadUtil;
 }
 
 /**
  * @company
  * @author tao
  * @date Apr 10, 2012 3:11:32 PM
  * 描述: 将文件上传到FTP服务器上的制定目录下
  * @param file 要上传的文件
  * @param path 文件路径
  * @param filename 文件名称
  * @return
  * @throws Exception
  */
 public boolean uploadFile(File file,String path, String filename)throws Exception { 
     boolean success = false; 
     FTPClient ftp = new FTPClient(); 
     try { 
         int reply;
         FileInputStream in = new FileInputStream(file);
         ftp.connect(IP, PORT);//连接FTP服务器 
         //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器 
         ftp.login(USERNAME, PASSWORD);//登录
//         ftp.setControlEncoding("GBK");
         reply = ftp.getReplyCode(); 
         if (!FTPReply.isPositiveCompletion(reply)) { 
             ftp.disconnect(); 
             return success; 
         } 
//         ftp.changeWorkingDirectory(path);
         if (CreateDirecroty(path,ftp)) {
          ftp.enterLocalPassiveMode();//设置为被动模式传输,否则程序部署到服务器上后选择上传的文件保存后一直处在运行中(不动了,进度条也走得很慢)
          ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//缺省的传输模式应该是ASCII,传输图片时需要binary
                success = ftp.storeFile(filename, in);
                in.close(); 
                ftp.logout(); 
//                success = true; 
            }else{
             log.error("动态创建文件夹失败了!!");
             throw new Exception("文件上传失败!!");
            }
     } catch (IOException e) {
      log.error("文件上传失败!!",e);
         throw new Exception("文件上传失败!!",e); 
     } finally { 
         if (ftp.isConnected()) { 
             try { 
                 ftp.disconnect(); 
             } catch (IOException ioe) { 
              log.error("文件上传失败!!",ioe);
              throw new Exception("文件上传失败!!",ioe); 
             } 
         } 
     } 
     return success; 
 }
 
 
 public boolean downFile(String remotePath,String fileName,String localPath) throws Exception { 
     boolean success = false; 
     FTPClient ftp = new FTPClient(); 
     try { 
         int reply; 
         ftp.connect(IP, 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(); 
         for(FTPFile ff:fs){ 
             if(ff.getName().equals(fileName)){ 
                 File localFile = new File(localPath+"/"+ff.getName()); 
                 OutputStream is = new FileOutputStream(localFile);  
                 ftp.retrieveFile(ff.getName(), is); 
                 is.close(); 
             } 
         } 
          
         ftp.logout(); 
         success = true; 
     } catch (IOException e) { 
      log.error("文件下载失败!!",e);
         throw new Exception("文件下载失败!!",e);
     } finally { 
         if (ftp.isConnected()) { 
             try { 
                 ftp.disconnect(); 
             } catch (IOException ioe) { 
              log.error("文件下载失败!!",ioe);
              throw new Exception("文件下载失败!!",ioe);
             } 
         } 
     } 
     return success; 
 }
 
 /**
  * @company
  * @author tao
  * @date Apr 10, 2012 5:35:22 PM
  * 描述:如果目录不存在动态的创建目录
  * @param path
  * @param ftp
  * @return
  * @throws IOException
  */
 public boolean CreateDirecroty(String path,FTPClient ftp) throws IOException {
        boolean success = true;
        // 如果远程目录不存在,则递归创建远程服务器目录
        if (!path.equalsIgnoreCase("/")&& !ftp.changeWorkingDirectory(new String(path))) {
            int start = 0;
            int end = 0;
            if (path.startsWith("/")) {
                start = 1;
            } else {
                start = 0;
            }
            end = path.indexOf("/", start);
            while (true) {
                String subDirectory = new String(path.substring(start, end));
                if (!ftp.changeWorkingDirectory(subDirectory)) {
                    if (ftp.makeDirectory(subDirectory)) {
                        ftp.changeWorkingDirectory(subDirectory);
                    } else {
                        System.out.println("创建目录失败");
                        success = false;
                        return success;
                    }
                }
                start = end + 1;
                end = path.indexOf("/", start);
                // 检查所有目录是否创建完毕
                if (end <= start) {
                    break;
                }
            }
        }
        return success;
    }
 
 
}

 

 

  • 大小: 25.2 KB
分享到:
评论

相关推荐

    PowerBuilder9.0语言实现FTP上传与下载

    《PowerBuilder 9.0 实现FTP上传与下载详解》 在信息技术领域,尤其是在软件开发中,数据交换和资源共享是常见的需求。对于采用PowerBuilder 9.0作为开发工具的项目,如何实现在受限环境中通过FTP(文件传输协议)...

    FTP架包以及附件上传FTP实现的方法

    在实现FTP附件上传的过程中,首先需要理解FTP的基本工作流程,包括连接、登录、传输模式选择(主动或被动)、文件操作(上传、下载、删除等)以及断开连接。以下是一套详细的FTP附件上传实现方法: 1. **建立连接**...

    ftp上传大附件

    当你需要将大附件上传到服务器时,FTP能提供一个有效且相对简单的解决方案。本示例("ftp上传大附件demo")旨在教你如何利用FTP服务来处理大文件的上传。 FTP上传大附件的关键在于正确设置和管理数据传输,因为大...

    C# WinForm实现FTP上传下载并生成日志文件

    本程序在VS2010环境下进行开发,程序用C# WinForm实现了FTP上传下载(可实现上传所选目录下的所有文件)并带上传进度条,程序会在运行根目录下自动生成日志文件以方便查看信息...本程序主要由socket进行通信...程序由...

    FTP多线程上传文件资料

    `2aafb73d4408cfe23a87ceff`和`6921555`后面的`_files`目录可能包含了相关文件或附件,用于辅助理解FTP多线程上传的实现细节。 总之,FTP多线程上传是一个涉及网络协议、多线程编程、错误处理和性能优化等多个方面...

    Oracle P/L SQL实现FTP上传、下载功能

    Oracle P/L SQL实现FTP上传、下载功能,以下是此过程包的头部,包体经常打包处理plb,感兴趣用户可以下载下来。 --Oracle上的FTP功能 Create or Replace Package UTL_FTP AUTHID CURRENT_USER as Type Connection ...

    在PB中实现ftp传输

    本篇文章将详细解释如何在PB中实现FTP传输,以及涉及到的相关知识点。 首先,我们需要理解FTP的基本概念。FTP是一种用于在网络上进行文件传输的标准协议,它允许用户从一个远程主机上传、下载文件或执行其他文件...

    百度ueditor支持本地与FTP上传图片

    综上所述,百度UEditor提供了完善的图片上传功能,既支持本地上传也支持通过FTP上传到远程服务器。通过合理配置`config.json`文件,可以满足不同场景下的图片管理需求。同时,结合`ueditor.jar`和`备注.txt`提供的...

    使用前端插件上传文件到ftp服务器

    本教程将深入探讨如何使用前端插件实现文件上传到FTP(File Transfer Protocol)服务器的过程,这是一个广泛用于文件传输的标准协议。我们将讨论关键概念、步骤以及可能涉及的技术。 ### FTP简介 FTP是一种在...

    FTP上传与下载pb9.0code

    标题“FTP上传与下载pb9.0code”指的是使用PowerBuilder 9.0(简称PB9)开发的一个程序,该程序实现了FTP(File Transfer Protocol)的上传和下载功能。PowerBuilder是一款强大的可视化编程工具,特别适合于构建...

    springboot以FTP方式上传文件到远程服务器

    Spring Boot 提供了强大的支持来实现文件上传,下面我们将一步步介绍如何使用 Spring Boot 实现 FTP 方式上传文件到远程服务器。 标题:Spring Boot 使用 FTP 方式上传文件到远程服务器 描述:主要介绍了 Spring ...

    web.net上实现类似ftp客户端上传

    在Web开发中,实现类似FTP客户端的上传和下载功能,主要涉及到的是文件传输技术,以及Web服务器与FTP服务器之间的交互。下面将详细讲解这个过程涉及的关键知识点。 首先,我们需要了解FTP(File Transfer Protocol...

    java多线程学习-ftp上传

    "6828269_files"和"691838_files"看起来像是HTML文件的附属资源文件夹,可能包含了一些与FTP上传相关的图片、CSS样式或JavaScript脚本,帮助解释或演示了多线程FTP上传的实现。 总结来说,Java多线程学习和FTP上传...

    FTP上传和下载,可以通过本地和服务器之间建立间接,通过FTP方式进行文件操作等

    FTP上传和下载,可以通过本地和服务器之间建立间接,通过FTP方式进行文件操作等

    一个用FTP传输文件的例子.rar_FTP传输文件_delphi附件_ftp_ftp delphi_传输附件

    Delphi附件部分可能是指在程序中添加附件功能,比如邮件客户端可能会通过FTP将附件上传到服务器,或者在FTP客户端中支持用户选择本地文件作为附件上传。这通常涉及到文件对话框的使用,以及将文件内容读取并传递到...

    3dMax脚本开发的FTP上传文件工具下载

    附件中的"FTP上传文件工具.jpg"可能是一个截图或教程图片,展示了如何使用这个工具,用户可以通过查看这张图片来了解其具体操作方式。而"FTP上传文件工具.ms"则是实际的脚本文件,用户可以直接在3DMax中运行它。 总...

    java实现ftp文件的上传与下载-附件资源

    java实现ftp文件的上传与下载-附件资源

    利用ftp4j实现ftps加密上传

    在Java开发中,我们可以借助第三方库如ftp4j来实现FTPS的加密上传功能。 ftp4j是一个轻量级、功能强大的Java FTP客户端库,支持FTP和FTPS协议。它提供了丰富的API,使开发者可以方便地执行各种FTP操作,如连接...

    用批处理命令实现FTP文件的自动传输

    "用批处理命令实现FTP文件的自动传输" 在 Windows 操作系统中,使用批处理命令可以实现 FTP 文件的自动传输。这种方法可以节省时间和精力,避免手动传输文件的麻烦。下面是实现自动传输的步骤: 首先,需要创建一...

    FTP、SMTP、POP3 c#实现

    在C#中实现FTP功能,通常会涉及到创建FTP客户端,连接到FTP服务器,登录,上传或下载文件,以及断开连接等操作。C#提供了System.Net.FtpWebRequest和System.Net.FtpWebResponse类来支持这些功能。例如,通过...

Global site tag (gtag.js) - Google Analytics