ColdFusion обработка HTML5 - PullRequest
       13

ColdFusion обработка HTML5

7 голосов
/ 07 сентября 2011

Я пытаюсь реализовать поле ввода HTML5, которое позволяет пользователю выбирать несколько файлов для загрузки.В моей форме есть следующее:

<form method="post" enctype="multipart/form-data" action="index.cfm">
    <input type="file" name="Images" id="Images" multiple="multiple" accept="image/jpeg, image/gif, image/png, application/zip" />
    ...

Я могу выбрать несколько файлов в браузере, затем нажать кнопку загрузки, но я не уверен, как обработать сообщение формы с помощью ColdFusion.Я думал, что сработает следующее, но при этом будет загружен только последний выбранный файл:

<cfloop list="#attributes.Images#" index="Image">
    <cffile
        destination = "#ExpandPath(Trim(request.TempFolder))#"
        filefield = "Images"
        action = "upload"
        nameconflict = "MakeUnique"
        result = "UploadedTempFile"
    >
    <cfoutput>#UploadedTempFile.serverFile#<br /></cfoutput>
</cfloop>

Может кто-нибудь объяснить мне, как перебирать все файлы, представленные через одно поле формы, чтобы я мог обрабатывать файлыиндивидуально

Ответы [ 3 ]

5 голосов
/ 16 сентября 2014

После поиска по нескольким постам в блоге, спотыкания об этом и прочтения документации 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>

Теперь я имею полный контроль над всеми загружаемыми файлами и могу обрабатывать необходимые результаты.

2 голосов
/ 12 сентября 2011

ОБНОВЛЕНИЕ : Начиная с ColdFusion 9 это было правдой.Это было исправлено в ColdFusion 10.

Итак, чтобы завершить наш разговор с комментариями:

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

Я бы хотел cffile action="uploadall", чтобы получить все многофайловые элементы HTML5.Нужно будет подать это как ER для CF10:).

1 голос
/ 08 августа 2018

fileUploadAll() / <cffile action="uploadAll"> позволяет загружать все файлы, а также несколько файлов <input type="file" multiple>.

Хотя он всегда обрабатывает все файлы запроса, т.е.не различает разные входные данные файла, которые вы, возможно, захотите обрабатывать по-разному, например, устанавливаете разные разрешенные типы MIME с помощью аргумента accept или загружаете файлы в разные места для каждого ввода.

Поэтому ясоздал запрос на улучшение Adobe ColdFusion и системы отслеживания проблем Lucee .

Основная идея заключается в изменении функции fileUpload() и <cffile action="upload"> для автоматического возвратамассив, если в поле формы есть несколько файлов или если это вызывает проблемы совместимости, добавьте новый аргумент multiple по умолчанию false, управляющий этим.

...