按类型

时间:2015-06-16 13:52:31

标签: coldfusion file-type

有没有办法在Coldfusion的列表中按文件类型排除某些项目? 背景:我只是将一个压缩工具集成到一个现有的应用程序中,并遇到了这个人的问题,即之前的代码会自动从服务器上传目标中获取文件并将其推送到网络附加存储。现在的目标是阻止他们的NAS迁移代码将所有文件移动到NAS,只有那些不是PDF的。我想要做的是遍历他们的变量,该变量存储上传文件的名称,并从列表中排除pdf,然后将列表传递到NAS代码,因此所有非pdf都被移动并且所有上传的pdf都保留在服务器上。使用他们的代码是一个挑战,因为没有人评论或记录任何东西,我一直在尝试几种方法。

    <cffile action="upload" destination= "c:\uploads\" result="myfiles" nameconflict="makeunique" >

    <cfset fileSys = CreateObject('component','cfc.FileManagement')>

    <cfif Len(get.realec_transactionid)>
        <cfset internalOnly=1 >
    </cfif>     
    **This line below is what I want to loop through and exclude file names 
    with pdf extensions **
    <cfset uploadedfilenames='#myfiles.clientFile#' >

    <CFSET a_insert_time = #TimeFormat(Now(), "HH:mm:ss")#>
    <CFSET a_insert_date = #DateFormat(Now(), "mm-dd-yyyy")#>
    **This line calls their method from another cfc that has all the file 
    migration methods.**
    <cfset new_file_name = #fileSys.MoveFromUploads(uploadedfilenames)#>
    **Once it moves the file to the NAS, it inserts the file info into the 
    DB table here**
    <cfquery name="addFile" datasource="#request.dsn#">
        INSERT INTO upload_many (title_id, fileDate, filetime, fileupload)
                VALUES('#get.title_id#', '#dateTimeStamp#', '#a_insert_time#', '#new_file_name#')
    </cfquery>


<cfelse>    
    <cffile action="upload" destination= #ExpandPath("./uploaded_files/zip.txt")# nameconflict="overwrite" >
</cfif>

更新6/18 尝试推荐的代码有助于在应用程序外部进行测试时排序文件类型的问题,但是只要它集成到应用程序中以操作变量uploadedfilenames,应用程序的其余部分就会失败,并且多文件上载模块只是抛出状态500错误并且CF日志中没有报告错误。我发现只是尝试在与代码中的任何内容无关的另一个变量上运行cfloop仍会导致错误。

2 个答案:

答案 0 :(得分:1)

根据我的理解,您希望从主列表uploadedfilenames中过滤掉具有特定文件类型/扩展名(例如:pdf)的文件名。这是最简单的方法之一:

<cfset lFileNames = "C:\myfiles\proj\icon-img-12.png,C:\myfiles\proj\sample-file.ppt,C:\myfiles\proj\fin-doc1.docx,C:\myfiles\proj\fin-doc2.pdf,C:\myfiles\proj\invoice-temp.docx,C:\myfiles\proj\invoice-final.pdf" />
<cfset lResultList = "" />
<cfset fileExtToExclude = "pdf" />
<cfloop list="#lFileNames#" index="fileItem" delimiters=",">
<cfif ListLast(ListLast(fileItem,'\'),'.') NEQ fileExtToExclude>
    <cfset lResultList = ListAppend(lResultList,"#fileItem#") />
</cfif>
</cfloop>

只使用ColdFusion提供的List函数,这很容易,您可以测试并尝试代码here。我建议你将这段代码包装在一个函数中以便于处理。另一种方法是在列表中使用一些复杂的正则表达式(如果你正在寻找一个更通用的解决方案,在ColdFusion的上下文之外)。

现在,将解决方案应用于您的问题:

<cfset uploadedfilenames='#myfiles.clientFile#' >
<cfset lResultList = "" />
<cfset fileExtToExclude = "pdf" />
<cfloop list="#uploadedfilenames#" index="fileItem" delimiters=",">
  <cfif ListLast(ListLast(fileItem,'\'),'.') NEQ fileExtToExclude>
      <cfset lResultList = ListAppend(lResultList,fileItem) />
  </cfif>
</cfloop>
<cfset uploadedfilenames = lResultList />
<!--- rest of your code continues --->

结果列表lResultList将复制到原始变量uploadedfilenames

答案 1 :(得分:0)

我希望我不会误解这个问题,但为什么不把所有内容都包含在一个读取完整文件名的if语句中呢?无论文件是逐个出现还是通过分隔列表,都应该很容易解决。

<cfif !listContains(ListName, '.pdf')>

OR

<cfif FileName does not contain '.pdf'>

然后

all the code you posted