После поиска по нескольким постам в блоге, спотыкания об этом и прочтения документации Adobe выясняется, что консенсус заключается в том, что поддержка многократной загрузки файлов не поддерживается с CF10 (если вы не используете флэш-формы).Проблема заключается в том, что значение uploadall для тега cffile может загружать все файлы, но вам не возвращается массив результатов, касающихся файлов.
Вот функция, которую я собрал вместе, которая использовала базовые методы Java и протестирована в ACF 10.
<cffunction name="getUploadedFiles" access="public" returntype="struct"
hint="Gets the uploaded files, grouped by the field name">
<cfset var local = {
files = {},
types = "text/plain,text/csv,application/msexcel,application/vnd.ms-excel,application/octet-stream",
tempFiles = form.getTempFiles(),
idx = 0} />
<cfscript>
arrayEach(form.getPartsArray(), function (field) {
var local = {fieldName = field.getName(), destinationFile = ""};
// Make sure the field available in the form is also
// available for the temporary files
if (structKeyExists(tempFiles, fieldName)) {
// Create the files of field array if it doesn't exist
if (!structKeyExists(files, fieldName)) {
files[fieldName] = [];
}
// If only 1 file was uploaded, it won't be an array - so make it one
if (!isArray(tempFiles[fieldName])) {
tempFiles[fieldName] = [tempFiles[fieldName]];
}
// Check that the form part is a file and within our list of valid types
if (field.isFile() && listFindNoCase(types, field.getContentType())) {
// Compile details about the upload
arrayAppend(files[fieldName], {
file = tempFiles[fieldName][++idx],
filePart = field,
filename = field.getFileName(),
filepath = field.getFilePath(),
contentType = field.getContentType(),
tempFile = tempFiles[fieldName][idx].getPath()
});
}
}
});
</cfscript>
<cfreturn local.files />
</cffunction>
Следуя комментариям, он просто перебирает все части формы, находит файлы и создаетмассив, содержащий некоторые полезные сведения о файле (и фильтрацию по определенным типам содержимого в соответствии с требованиями моего приложения).
Затем я создал функцию uploadFile , которая принимает fieldName и destinationPath аргументы.Я получаю массив загруженных файлов на основе поля, которое я передаю, перебираю файлы, чтобы убедиться, что целевой путь к файлу не существует (и делаю его уникальным, если это так), а затем записываю файл назначения, используя содержимое java.io.File объект, на который ссылается временная загрузка.
<cffunction name="uploadFile" access="public" returntype="array"
hint="Uploads a file (or multiple files) from the form to the server">
<cfargument name="fieldName" type="string" required="true" />
<cfargument name="destinationPath" type="string" required="true" />
<cfset var local = {files = [], filepaths = [], allFiles = getUploadedFiles()} />
<cfif structKeyExists(local.allFiles, arguments.fieldName)>
<cfset local.files = local.allFiles[arguments.fieldName] />
</cfif>
<cfloop array="#local.files#" index="local.file">
<cfset local.file.destinationFile = arguments.destinationPath & local.file.fileName />
<cfif fileExists(local.file.destinationFile)>
<cfset local.file.destinationFile = listFirst(local.file.destinationFile, ".") & "_#getTickCount()#.csv" />
</cfif>
<cfset fileWrite(local.file.destinationFile, fileRead(local.file.file)) />
<cfset arrayAppend(local.filePaths, local.file.destinationFile) />
</cfloop>
<cfset setActiveFileName(local.filePaths[arrayLen(local.filePaths)]) />
<cfreturn local.filePaths />
</cffunction>
Теперь я имею полный контроль над всеми загружаемыми файлами и могу обрабатывать необходимые результаты.