ColdFusion CFFTP action =“listdir”什么都不返回

时间:2013-10-30 16:22:54

标签: coldfusion listdir cfftp

我正在尝试使用CFFTP登录buy.com的市场并下载帐户的订单。 Buy.com允许您将FTP导入您的帐户文件夹并下载您的订单作为TXT文件供您自己参考。我知道我的凭据工作正常,因为我可以使用任何FTP桌面程序成功登录,所以这不是问题。

我遇到的麻烦实际上列出了FTP根文件夹的内容。我应该看到这样的文件夹:

  • 取消
  • 配送
  • 广告
  • NewSku
  • 订单
  • 付款
  • 退款

“订单”文件夹包含带有客户订单的TXT文件,是我最终想要获取列表的文件夹。但是,我得到一个空列表(当我转储下面的“dirlist”变量时,空查询),即使CFFTP调用看起来像连接和断开连接正常。我尝试更改目录以获取“/”或“/ Orders /”的列表,甚至是“/ Orders”,但所有内容都是空的。

这是我的代码(由于显而易见的原因,我编辑了用户名和密码)。欢迎任何想法。

<cfparam name="dirlist" type="query" default="#queryNew('')#" />

<cfftp connection="myConnection"
    username="***************"
    password="*********"
    server="trade.marketplace.buy.com"
    action="open"
    stopOnError="yes"
    />

<p>Successful open? <cfoutput>#cfftp.succeeded#</cfoutput></p>

<cfftp connection="myConnection" 
    action="listdir" 
    stopOnError="yes" 
    name="dirlist" 
    directory="/Orders" 
    />

<cfdump var="#dirlist#" />

<cfftp connection="myConnection"
    action="close"
    stopOnError="yes"
    />

<p>Successful close? <cfoutput>#cfftp.succeeded#</cfoutput></p>

这些是浏览器中显示的结果(“查询”基本上是目录列表的空var转储):

Successful open? YES

query

Successful close? YES

2 个答案:

答案 0 :(得分:2)

经过多次烦恼,我放弃了CFFTP。我不认为我做错了什么,代码是对的,凭据没问题,没有什么阻止通过防火墙访问FTP帐户。

相反,我在edtftpj找到了一个工作正常的Java库。它是LGPL的开源软件,它的API非常容易理解。

所以,我首先从他们的网站下载了JAR文件,把它放在[ColdFusion Install Folder] / bin文件夹中,重新启动CF,然后使用这段代码:

<!--- page variables --->
<cfparam name="VARIABLES.ftp" type="any" default="" />
<cfparam name="VARIABLES.aFiles" type="array" default="#arrayNew(1)#" />
<cfparam name="VARIABLES.index" type="numeric" default="1" />
<cfparam name="VARIABLES.cLocalFolder" type="string" default="#expandPath('/integrations/buy/txt/queue/')#" />
<cfparam name="VARIABLES.cLocalFile" type="string" default="" />
<cfparam name="VARIABLES.cFileName" type="string" default="" />

<!--- create instance of edtftpj.jar custom FTP --->    
<cfset VARIABLES.ftp = createObject( "java", "com.enterprisedt.net.ftp.FileTransferClient" ) />

<!--- connect with custom java object and get the contents of the 'Orders' folder --->
<cfset VARIABLES.ftp.setRemoteHost( "trade.marketplace.buy.com" ) />
<cfset VARIABLES.ftp.setUserName( "*************" ) />
<cfset VARIABLES.ftp.setPassword( "*************" ) />
<cfset VARIABLES.ftp.connect() />

<cfset VARIABLES.ftp.changeDirectory('/Orders') />

<cfset VARIABLES.aFiles = ftp.directoryList(".") />

<!--- Proceed only if folder has contents --->
<cfif arrayLen(VARIABLES.aFiles)>

    <!--- Loop through ftp directory contents (files and folders) --->
    <cfloop from="1" to="#arrayLen(VARIABLES.aFiles)#" step="1" index="VARIABLES.index">

        <!--- Download only files and not folders --->
        <cfif VARIABLES.aFiles[VARIABLES.index].isFile()>

            <!--- Set the local file name and download to it --->
            <cfset VARIABLES.cFileName = aFiles[VARIABLES.index].getName() />
            <cfset VARIABLES.cLocalFile = VARIABLES.cLocalFolder & VARIABLES.cFileName />
            <cfset VARIABLES.ftp.downloadFile( VARIABLES.cLocalFile, VARIABLES.cFileName ) />

        </cfif>

    </cfloop>

</cfif>

<!--- Disconnect --->
<cfset VARIABLES.ftp.disconnect() />

我应该写一篇关于此的博文:)

答案 1 :(得分:0)

我发现一些FTP服务器在目录路径的末尾需要通配符星号:

<cfftp connection="myConnection" 
    action="listdir" 
    stopOnError="yes" 
    name="dirlist" 
    directory="/Orders/*" 
    />

我通常也会添加passive=true