2

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

我遇到的问题实际上是列出 FTP 根文件夹的内容。我应该看到这样的文件夹:

  • 取消
  • 履行
  • 存货
  • 新库
  • 订单
  • 付款
  • 退款

文件夹“订单”包含客户订单的 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
4

2 回答 2

2

经过一番折腾,我放弃了 CFFTP。我不认为我做错了什么,代码是正确的,凭据是好的,没有任何东西阻止通过防火墙访问 FTP 帐户。

相反,我在edtftpj找到了一个运行良好的 Java 库。它是 LGPL 开源的,它的 API 很容易理解。

所以,我首先从他们的网站下载了 JAR 文件,将它放在 [ColdFusion 安装文件夹]/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() />

我应该写一篇关于这个的博客文章:)

于 2013-10-31T22:58:39.223 回答
0

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

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

我也经常加passive=true

于 2013-11-01T13:57:20.913 回答