CFFILE - Загрузка файла с помощью компонента

У меня есть форма, которую я хотел бы отправить компоненту для обработки (поведение CRUD), проблема в том, что кажется, что передача multipart/form-data компоненту каким-то образом теряет местоположение файла. Когда дело доходит до части компонента, которая должна загружать файл, я получаю печально известное поле формы, не содержащее ошибку файла.

Я не уверен на 100%, почему это происходит, но если я отправляю форму непосредственно на страницу .cfm, которая выполняет действие cffile, все работает, как и ожидалось, но если страница .cfm делает что-то вроде:

<cfobject name="process_form" component="processor" />
<cfset result = process_form.upload( form ) />

и компонент "процессор" пытается выполнить загрузку, я получаю, что поле формы не содержит файла.

Мой процессор выглядит так:

    <cfcomponent name="processor">
      <cffunction name="upload" returntype="string">
      <cfargument name="form_data" type="struct" />
      <cffile action="upload" filefield="#arguments.form_data.file_1#" ...>
          [ ... ]
      </cffunction>
    </cfcomponent>

Следует отметить одну вещь: если я попытаюсь использовать переменную arguments.form_data.file_1 без знаков # вокруг нее, я получу ошибку:

The form field arguments.form_data.file_1 did not contain a file.

Если я поставлю знаки # вокруг переменной, я получу:

The form field C:\JRun4\servers\cfusion\SERVER-INF\temp\cfusion-war-tmp\neotmp7350969777287007477.tmp did not contain a file. 

Любая идея о том, как решить эту проблему? Я бы предпочел, чтобы все мои действия по обработке были внутри компонента, но сейчас я не могу заставить это работать.

Спасибо! Буду


person wblakenc    schedule 21.10.2011    source источник


Ответы (1)


Вам не нужно использовать полное имя переменной при использовании тега cffile — вам просто нужно имя поля формы, например:

<cffile action="upload" filefield="file_1" ...>

должно хватить. Поле структуры FORM содержит расположение временного файла, но тегу cffile это не нужно (я бы представил, что id напрямую обращается к структуре FORM на серверной части на основе предоставленного вами имени поля).

person Michael C. O'Connor    schedule 21.10.2011
comment
Я только что попробовал и получил: Поле формы form_data.file_1 не содержит файла. - person wblakenc; 22.10.2011
comment
@wblakenc, извините, я идиот и не посмотрел, что скопировал и вставил. Вы можете просто использовать имя поля, file_1. Я исправил исходный ответ. - person Michael C. O'Connor; 22.10.2011
comment
Извините за задержку. Ты прав! Отличный ответ. Я не уверен, как поле file_1 все еще находится в области видимости, но, похоже, оно работает. Спасибо еще раз. - person wblakenc; 25.10.2011
comment
Рад, что это сработало. Хитрость заключается в том, что вы фактически не передаете фактическое значение тегу cffile, а только строку name поля формы. - person Michael C. O'Connor; 25.10.2011