Загрузка нескольких файлов - PullRequest
0 голосов
/ 20 июля 2011

У меня есть форма, где пользователи должны загрузить как минимум три документа и до семи. В его текущем состоянии у меня есть все функции проверки и проверки ошибок. Я хочу, чтобы формы посетителей переименовывали указанное имя, как только они загружены и помещены в указанный каталог. Мой код здесь: http://pastebin.com/V5ThWe7M

Я считаю, что проблема возникает в строке 456. Я считаю, что мне нужно сохранить имя файла в переменной, а затем использовать переменную для обработки функции переименования. Первый файл загружается, но не второй, так как им присваиваются одинаковые имена. Я пытаюсь выяснить, как использовать переменные, которые хранят отдельные имена файлов, а затем использовать эту переменную для переименования файла. Мне бы хотелось, чтобы другой глаз посмотрел на меня и указал в правильном направлении.

Спасибо

Ответы [ 2 ]

1 голос
/ 21 июля 2011

Как уже упоминалось, структура CFFILE перезаписывается при каждой загрузке. Поэтому любые значения, которые вы хотите сохранить, вы должны сохранить в другой переменной. Но так как вы уже сохраняете полные имена файлов в переменную, вы можете легко извлечь их расширения, используя функции списка. Например:

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

Несколько других наблюдений

  • Рассмотрим более уникальную схему именования ваших папок, чем "/ firstName_lastName /". В противном случае вы можете перезаписать чьи-то файлы, если получите несколько заявок под одним и тем же именем, например два разных «Джона Смита».

  • Значения cffile разделены на две категории: cffile.serverXX и cffile.clientXX (т. Е. Пользовательская система). Они не взаимозаменяемы. Поэтому убедитесь, что вы используете правильные переменные и будьте последовательны.

  • FILE устарело. Вместо этого используйте CFFILE или атрибут result.

1 голос
/ 21 июля 2011

РЕДАКТИРОВАТЬ: Добавление нового кода в микс ...:)

Вот некоторые функции, просто нажмите их в верхней части вашей страницы ...

<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>

У меня нет временичтобы проверить вышесказанное, но я считаю, что это пугающе близко.Если у вас возникнут проблемы, дайте мне знать, и я помогу вам отладить их.:)

...