上传多个文件

时间:2011-07-19 20:33:07

标签: coldfusion coldfusion-8

我有一个表单,用户要上传至少三个文档,最多七个。在当前状态下,我具有所有错误检查和验证功能。我想要发生的是访问者的表单在上传并放入指定目录后重命名为指定的名称。我的代码在这里:http://pastebin.com/V5ThWe7M

我认为问题出现在第456行附近。我认为我需要将文件名存储在变量中,然后使用该变量来处理重命名功能。第一个文件上传但不是第二个文件,因为它们被分配了相同的名称。我试图弄清楚如何使用存储单个文件名的变量,然后使用该变量重命名该文件。我想让另外一双眼睛为我检查并指出我正确的方向。

谢谢

2 个答案:

答案 0 :(得分:1)

编辑:在混音中添加一些新代码......:)

这是一些功能,只需将它们打到页面顶部......

<cffunction name="uploadFile">
    <cfargument name="formField" hint="Form field name that holds the file to be uploaded" required="yes">
    <cfargument name="renameTo" hint="What to rename the file, ex: 01_nominationLetter" required="yes">
    <cfargument name="uploadErrorMessage" required="no" default="Error uploading file"/>
    <cfargument name="allowedExtensions" required="no" default="doc,docx,pdf,txt,rt">
    <cfargument name="extensionErrorMessage" required="no" default="Only doc, docx, pdf, txt, and rtf file formats are accepted">
    <cfset var dir = expandPath("./nominationUploads/#trim(form.fname)#_#trim(form.lname)#/")>
    <cfparam name="request.filesUploaded" default="#arrayNew(1)#">
    <cftry>
        <cffile action="upload" filefield="#arguments.formField#" nameconflict="makeunique" destination="#dir#">
        <cfcatch type="any"><cfset ArrayAppend(arrErrors, arguments.uploadErrorMessage )></cfcatch>
    </cftry>
    <cfif not listFindNoCase(arguments.allowedExtensions, cffile.ServerFileExt)>
        <cfset ArrayAppend(arrErrors, arguments.extensionErrorMessage )>
    </cfif>
    <cffile action="rename" file="#dir##cffile.serverFile#" destination="#dir##renameTo#.#cffile.ServerFileExt#">
    <cfset ArrayAppend(request.filesUploaded, dir & arguments.renameTo & "." & cffile.ServerFileExt )>
</cffunction>

<cffunction name="removeFilesOnError">
    <cfloop from="1" to="#arrayLen(request.filesUploaded)#" index="i">
        <cftry><cffile action="delete" file="#request.filesUploaded[i]#"/><cfcatch type="any"></cfcatch></cftry>
    </cfloop>
</cffunction>

然后在你现有的验证脚本中,摆脱所有文件的东西,而你只需要使用上面的那些函数,如下所示:

<cfset uploadFile('myFileField',  'renameToThis'  )>
<cfset uploadFile('myFileField2', 'renameToThat' , 'My custom upload error!')>
<cfset uploadFile('anotherFile',  'differentName', 'Another custom upload msg!', 'doc,docx', 'This one only lets you upload word docs!')>

<cfif arrayLen( arrErrors ) >
    <cfset removeFilesOnError()>
</cfif>

我没有时间对上述内容进行测试,但我认为它非常接近。如果您遇到问题,请告诉我,我会帮您调试。 :)

答案 1 :(得分:1)

如前所述,每次上传时都会覆盖CFFILE结构。因此,您希望保留的任何值都必须保存到另一个变量。但由于您已将完整文件名保存到变量,因此可以使用列表函数轻松提取其扩展名。例如:

     <cfset nomExt = listLast(clientNominationLetter, ".")>

其他一些观察

  • 为您的文件夹考虑一种比“/ firstName_lastName /”更独特的命名方案。否则,如果您收到多个同名的提交内容,最终可能会覆盖某人的文件,例如两个不同的“John Smith's”。

  • cffile值分为两类:cffile.serverXXcffile.clientXX(即用户系统)。它们可互换。因此,请确保使用正确的变量并保持一致。

  • FILE已弃用。请改用CFFILEresult属性。