2011-07-19 274 views
0

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

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

谢谢

回答

1

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

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

其他一些意见

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

  • cffile值分为两类:cffile.serverXXcffile.clientXX(即用户系统)。他们是而不是可互换。所以确保你使用正确的变量并保持一致。

  • FILE已弃用。改为使用CFFILEresult属性。

+0

感谢您的意见。你对目录的命名方案是正确的。我已添加用户的uuid: fistName_lastName_uuid – aparker81

+0

我接受此答案,因为您可以讨论并帮助我解决大部分遇到的问题。 – aparker81

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> 

我没有时间去测试上面的内容,但我相信它非常接近。如果遇到问题,请告诉我,我会帮你调试。 :)

+0

谢谢你对谁也帮我,因为我已经搜查了三个留言板和两个电子邮件列表帮助的人。 您的解决方案在某种程度上是正确的。使用您的解决方案,验证仍会识别不正确的文件扩展名。也就是说,如果我尝试上传html文件,则验证状态表明它不是正确的文件格式。但是,该文件仍然会上传。 重命名操作最初是在哪里,如果它们是不正确的文件类型,则不会上传文件。 这就是为什么我不知道如果将文件存储为变量会最好,但只是不确定 – aparker81

+0

没有问题。 =)继续并上传它们,然后在验证失败时将它们全部吹走。您可以执行filesUploaded = ArrayNew(1),然后每次完成上载时将其添加到数组中。最后,如果验证失败,则循环数组并杀死它们! :) – Nate

+0

抱歉密集,但你能提供你的意思是伪代码吗? – aparker81