用mule实现FTP文件上传

该博客介绍了如何使用Mule配置文件实现FTP文件上传功能。首先,展示了配置文件的内容,包括文件连接器、SMTP连接器和FTP连接器的设置。接着,解释了配置中的MulticastingRouter如何同时将文件上传到FTP并发送邮件通知。然后,详细说明了监听文件夹、处理文件和构造邮件内容的服务及转换器类。最后,提到了通过main函数进行调试的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 功能: 将某个文件放入特定的目录里(本demo是放入e:/temp目录), 然后将该文件上传到FTP上, 并且发送电子邮件通知文件已经上传

-------------------------------------------------第一步----------------------------------------------------------------------
首先写配制文件
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mule-configuration PUBLIC "-//MuleSource //DTD mule-configuration XML V1.0//EN"
                                "http://mule.mulesource.org/dtds/mule-configuration.dtd">


<mule-configuration id="ftp-upload" version="1.0">

 <description>File upload via FTP</description>

 <connector name="myFileConnector" className="org.mule.providers.file.FileConnector">
  <properties>
   <!-- property name="moveToDirectory" value="ftp://wuda:wuda@172.16.0.34/temp/" /-->
   <property name="moveToPattern" value="${SYSTIME}_${ORIGINALNAME}" />
  </properties>
 </connector>
 <connector name="EmailConnector" className="org.mule.providers.email.SmtpConnector">
  <properties>
   <property name="fromAddress" value="wuda@localhost" />
   <property name="hostname" value="localhost" />
   <property name="username" value="root" />
   <property name="password" value="root" />
   <property name="subject" value="file Received!" />
  </properties>
 </connector>
 <connector name="myFTPConnector" className="org.mule.providers.ftp.FtpConnector">
  <properties>
   <property name="pollingFrequency" value="1000" />
   <property name="filenameParser" value="${SYSTIME}_${ORIGINALNAME}.txt" />
  </properties>
 </connector>

 <endpoint-identifiers>
  <endpoint-identifier name="ServiceInbound" value="file:///e:/temp" />
  <endpoint-identifier name="ToSmtpServer" value="smtp://localhost?address=wuda@localhost" />
  <endpoint-identifier name="fileupload" value="ftp://wuda:wuda@172.16.0.34/~/upload" />
 </endpoint-identifiers>
 
    <transformers>
        <transformer name="sendMail" className="transformer.SendMail"
            returnClass="java.lang.String"/>
        <transformer name="stringToEmailMessage" className="org.mule.providers.email.transformers.StringToEmailMessage"
         returnClass="javax.mail.Message"/>
    </transformers>
 
 <!--
  The Mule model initialises and manages your UMO components
 -->
 <model name="file-smtp">
  <mule-descriptor name="SmtpNotification" implementation="service.FtpUpload">
   <inbound-router>
    <endpoint address="ServiceInbound" />
   </inbound-router>
   <outbound-router>
    <router className="org.mule.routing.outbound.MulticastingRouter">
     <endpoint address="ftp://wuda:wuda@172.16.0.34/~" >
      <properties>
       <property name="outputPattern" value="${ORIGINALNAME}"/>
      </properties>
     </endpoint>
     <endpoint address="ToSmtpServer" transformers="sendMail stringToEmailMessage"/>
    </router>
   </outbound-router>
  </mule-descriptor>
  
 </model>
</mule-configuration>

这里需要对这段配制进行一些说明:
   <outbound-router>
    <router className="org.mule.routing.outbound.MulticastingRouter">
     <endpoint address="ftp://wuda:wuda@172.16.0.34/~" >
      <properties>
       <property name="outputPattern" value="${ORIGINALNAME}"/>
      </properties>
     </endpoint>
     <endpoint address="ToSmtpServer" transformers="sendMail stringToEmailMessage"/>
    </router>
   </outbound-router>
这里采用MulticastingRouter的方法,来实现发送到多个endpoint, 第一个是实现将文件写到FTP, 第二个是实现电子邮件的发送

-------------------------------------------------第二步----------------------------------------------------------------------
service.FtpUpload文件
package service;

import java.util.HashMap;
import java.util.Map;

import org.mule.umo.UMOEventContext;
import org.mule.umo.UMOMessage;
import org.mule.umo.lifecycle.Callable;

public class FtpUpload implements Callable {

 public Object onCall(UMOEventContext eventContext) throws Exception {
  UMOMessage message = eventContext.getMessage();
  //获取文件名
  String fileName =message.getProperty("originalFilename").toString();
  byte[] buf = message.getAdapter().getPayloadAsBytes();
  return buf;
 }
}

这个类是对e:/temp目录的监听,一旦有文件到达该目录后,就会将这个文件以byte[]的形式放入UMOMessage里


-------------------------------------------------第三步----------------------------------------------------------------------
transformer.SendMail文件

package transformer;

import org.mule.impl.RequestContext;
import org.mule.transformers.AbstractTransformer;
import org.mule.umo.UMOEventContext;
import org.mule.umo.UMOMessage;
import org.mule.umo.transformer.TransformerException;

public class SendMail extends AbstractTransformer {
 
 public SendMail(){
  super();
//  this.registerSourceType(byte.class);
 }

 @Override
 protected Object doTransform(Object src, String encoding)
   throws TransformerException {

  UMOEventContext eventContext= RequestContext.getEventContext();
  UMOMessage message = eventContext.getMessage();
  String fileName =message.getProperty("originalFilename").toString();
  
  return "you have received a email named "+fileName;
 }
}

注意:
1. 这个类并不是实现转换目的,而是实现构造电子邮件内容的功能
2. 这个类返回的是String类型, 但是smtp要求被发送的邮件是javax.mail.Message, 所以还要进行一个转换--stringToEmailMessage它使用了mule本身的org.mule.providers.email.transformers.StringToEmailMessage类
3. 这样写是不支持中文的,因为mule本身是用ISO-8859-1, 所以还得做相应的调整,这将会在以下的详解中提到

-------------------------------------------------第三步----------------------------------------------------------------------
写一个main函数, 这个主要的作用是方便调试
 public static void main(String[] args) throws Exception {
  String rootPath = System.getProperty("user.dir");
  String filePath = rootPath +"//conf//mule-ftp-upload-configl.xml";
        MuleXmlConfigurationBuilder builder = new MuleXmlConfigurationBuilder();
        builder.configure(filePath);
 }
下面就可以调试了.
-------------------------------------------------完成--------------------------------------------------------------------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值