Множественный аплоад файлов с помощью Acts As Attachment

Posted on August 11, 2007
Иногда с одной формы необходимо закачать несколько файлов сразу ... Недавно мне пришлось столкнуться с этой проблемой для написания простенькой текстовой CMS.
Был выбран acts_as_attachment (я его люблю) и написано небольшое количество кода.
Во первых, в страницу для закачки был вставлен яваскрипт который динамически добавлял, удалял поля типа файл:

<script type="text/javascript">
  var file_index = 0;
function add_file()
{
  var smb = document.createElement("input");
  smb.type = "file";
  smb.name = "file[" + file_index + "]";
  smb.id = "file_" + file_index;
  document.getElementById("files").appendChild(smb);
  var a = document.createElement("a");
  a.href = "javascript:remove_file(" + file_index + ");";
  a.id = "remove_file_" + file_index;
  a.appendChild(document.createTextNode("Удалить"));
  document.getElementById("files").appendChild(a);
  var br = document.createElement("br");
  br.id = "br_file_" + file_index;
  document.getElementById("files").appendChild(br);
  file_index++;
}

function remove_file(id)
{
  var container = document.getElementById("files");
  var input_f = document.getElementById("file_" + id);
  var a = document.getElementById("remove_file_" + id);
  var br = document.getElementById("br_file_" + id);
  container.removeChild(input_f);
  container.removeChild(a);
  container.removeChild(br);
}

</script>
При вызове add_file внутрь дива с id "files" добавляется новый набор из поля воода, ссылки на удаление этого поля и переноса строки.
В код контроллера был вставлен следующий фрагмент для обработки:

      params[:file].each do |f|
        p = Hash["attachment" => {"uploaded_data" => ""}]
        p["attachment"]["uploaded_data"] = f[1]
        att = Attachment.create!p["attachment"]
        @page.attachments << att
      end
Конечно обработки на правильность файлов нет, но добавить её дело 2х минут

Comments
  1. lunaticAugust 12, 2007 @ 10:56 AM
    А круче делать множественный аплоад файлов через iframe, тогда нужен только один инпут и все будет работать без перезагрузки
  2. Konstantin TumalevichAugust 12, 2007 @ 12:19 PM
    Тогда вообще через flash. Скоро кину пример.
  3. pinguAugust 21, 2007 @ 06:36 AM
    Проще сделать через activeupload -- сразу и множественный аплоад, и прогресс бар, проверка размера и расширения. (http://code.google.com/p/activeupload/)