Ошибка FileUpload — поле формы fileInput не содержит файла (CFML — FW/1)

Я пытаюсь загрузить файл на сайт ColdFusion и получаю следующую ошибку:

"Поле формы fileInput не содержит файла."

Файл вместе с некоторыми текстовыми значениями отправляется через форму на странице редактирования. Форма передается методу «сохранить» в контроллере, который отправляет два вызова в fileService. Текстовые значения передаются, как и ожидалось, и их обновление работает нормально. Когда я выгружаю структуру RC Scope, «fileInput» (имя ввода, которое я использую для получения файла) отображается как [пустая строка]. Он вообще не отображается в области формы. Кто-нибудь знает, что может быть причиной проблемы с этим? Есть несколько ответов на вопросы, связанные с формами, которые используют cffile (теги), но все на сайте, над которым я работаю, использует FileUpload (cfscript), поэтому я не уверен, как применить эти ответы здесь.

К вашему сведению, сайт использует Framework One (FW/1 версии 4.1) в качестве своей среды MVC. Я использую ColdFusion 2016. Ниже приведены фрагменты используемого кода.


Просмотр: Edit.cfm

<form action="#BuildURL( action='file.save' )#" name="filesForm" method="post" enctype="multipart/form-data">
  <input id="file_id" name="file_id" type="hidden" value="#rc.file_id#">
  <div class="form-group">
    <label for="name">File Name</label>
    <input type="text" class="form-control" id="name" name="name" placeholder="Enter File Name" value="#rc.name#">
  </div>
  <div class="form-group">
    <label for="fileInput">File Upload</label>
    <input type="file" id="fileInput" name"fileInput"> 
  </div>
  <div class="form-group">
    <button type="submit" class="btn btn-primary" name="Submit">Save</button>
  </div>
</form>

Контроллер: файл.cfc

public void function edit(rc){
  if (StructKeyExists(rc, 'file_id') && rc.file_id > 0){
    var q = fileService.getFile(rc.file_id);
    rc.file_id = q.file_id;
    rc.name = q.name;
  }
}

public void function save(required struct rc){
  rc.file_id = variables.fileService.save(rc.file_id, rc.name);

  param name = "rc.fileInput" default="";
  rc.result = variables.fileService.uploadFile(file = "fileInput");

  variables.fw.redirect(action='file.edit', append='file_id', queryString = "msg=updated");
}

Сервис: файл.cfc

struct function uploadFile(required string file){
  fileUploadResult = FileUpload(getTempDirectory(), arguments.file, "application/pdf", "MakeUnique");
}

person Michael George    schedule 16.11.2017    source источник
comment
1) Мне не нравится имя file.cfc. Попробуйте дать ему другое имя. То же самое касается arguments.file. Интересно, не наступают ли разные значения file друг на друга. 2) В краткосрочной перспективе попробуйте перенести код из службы в контроллер.   -  person James A Mohler    schedule 17.11.2017
comment
Спасибо за предложения. Я попытался переименовать cfc и arguments, но это не решило проблему. Однако это кажется лучшей практикой, чтобы избежать путаницы с кодом и отладкой. На самом деле я «позаимствовал» идею использования «arguments.file» и пару других частей кода из Xindi CMS. поскольку это был самый близкий пример загрузки файла с использованием FW/1, который я смог найти. Хотя не уверен, что еще мне не хватает.   -  person Michael George    schedule 17.11.2017
comment
Кроме того, я попытался переместить код службы в контроллер, чтобы упростить задачу, но он все равно возвращает ту же ошибку. Далее следует модифицированный код контроллера, который, насколько я могу судить из документации ColdFusion, должен работать. Сказав, что я довольно новичок в ColdFusion, поэтому я, вероятно, упускаю что-то очевидное для тех, кто занимается этим дольше. result = fileUpload(getTempDirectory(), "fileInput", "application/pdf", "MakeUnique");   -  person Michael George    schedule 17.11.2017
comment
Если вы хотите посмотреть пример кода, попробуйте github.com/jmohler1970/BS-4-CF/blob/master/model/services/ Отказ от ответственности, я написал это.   -  person James A Mohler    schedule 18.11.2017
comment
Хотя другой. Попробуйте сделать это на одном шаблоне. Пропустите всю FW/1 в краткосрочной перспективе. Легко переместить .cfm в представление. Позже разделите его на представление и контроллер. Наконец просмотр, контроллер, сервис   -  person James A Mohler    schedule 18.11.2017
comment
Спасибо, Джеймс. Наконец-то у меня заработала загрузка файлов. Я просмотрел пример кода, на который вы предоставили ссылку, и ценю, что вы им поделились. Я уверен, что многому у него научусь.   -  person Michael George    schedule 21.11.2017


Ответы (3)


Оказывается, проблема была в теге ввода файла. Я пропустил знак «равно» в объявлении имени (т. е. name="fileInput"), поэтому файл не был включен. Невероятно... Все остальное заработало после того, как я это исправил, хотя я приму предложения по очистке именования. Спасибо всем за вашу помощь.

person Michael George    schedule 21.11.2017

Я не знаком с FW/1, но, возможно, в функции public void save() fileInput должен быть rc.fileInput, т.е.

 rc.result = variables.fileService.uploadFile(file = rc.fileInput);
person Yieng Ly    schedule 17.11.2017
comment
Спасибо за предложение. Я пробовал это, но все равно получил тот же результат. Из того, что было упомянуто в FW/1 Group и что содержится в Документах Adobe это должно использовать имя поля формы, а не ссылку на него. Мне интересно, связано ли это с тем, как значения формы передаются из представления редактирования в контроллер сохранения. fileInput не отображается, когда я выгружаю структуру формы, поэтому, возможно, я неправильно ее передаю. - person Michael George; 17.11.2017
comment
Попробуйте сделать загрузку непосредственно в сохранении, т.е. вместо того, чтобы создавать отдельную функцию, вызовите это внутри функции сохранения: fileUploadResult = FileUpload(getTempDirectory(), arguments.file, application/pdf, MakeUnique); - person Yieng Ly; 18.11.2017

Вы пытались сбросить переменную области rc и какой файл вы пытаетесь загрузить, убедитесь, что это не пустой текстовый файл.

person jonesk    schedule 17.11.2017
comment
Я сбросил области rc и form из контроллера сохранения, и ни один из них не показывает fileInput как имя поля в структуре. Я сделал дамп для rc.fileInput, и он отображается как неопределенный, даже после того, как я переместил вызов для настройки параметра в метод редактирования в контроллере (который должен быть обработан первым). Странный. Я почти уверен, что именно здесь и есть пробел - это значение не отправляется методу сохранения. Один и тот же код, размещенный на одной странице cfm, будет работать, как и ожидалось. Просто когда я помещаю все это в часть структуры MVC, я получаю ошибки. - person Michael George; 17.11.2017
comment
Кроме того, я убедился, что тестовый PDF-файл, который я загружал, работает правильно. Я попробовал и пару других. Спасибо за предложения, хотя. - person Michael George; 17.11.2017