我正在尝试使用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
答案 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
。