2015-09-29 3 views
0

У меня есть приложение Meteor, в которое я вставляю документ (название, описание, клиент, ...) в базу данных. Приложение использует Autoform, Simple Schema и Collection2. Теперь я хочу добавить возможность загрузить файл на S3.Meteor Upload to AWS S3

Чтобы все было просто, я представлял файл-пиккер как часть «Создать документ», и как только файл будет загружен, поле URL (из Autoform) должно показать URL-адрес документа на S3 (после его загрузки) так что URL-адрес в конечном итоге сохраняется в коллекции документов при нажатии кнопки создания. Я понимаю, что могут быть лучшие способы, но хотелось бы сохранить все просто.

Я попытался объединить учебник here. Загрузка на S3 работает, но я не могу получить URL-адрес для загруженного файла хранимой коллекции документов. На следующем скриншоте показан макет. Есть идеи? screenshot

Мой текущий код можно найти here.

+0

Можете ли вы сузить место ошибки? Например, вызов метода 'storeUrlInDatabase' преуспевает или терпит неудачу? –

+0

Кроме того, чтобы помочь с отладкой, не возвращайте исключение. Вместо этого 'throw new Meteor.Error (' file-insert-failed ', exception.toString()) '. –

+0

Как таковой нет сообщения об ошибке. Позвольте мне попытаться немного уточнить: файлы загружаются на S3 правильно, и URL-адрес добавляется в коллекцию «Файлы». Я мог бы добавить в коллекцию «Файлы» ссылку на Doc._id (к которой принадлежит загруженный файл). Вместо этого я хотел бы использовать только коллекцию «Документы» с параметром «URL». Таким образом, я мог бы использовать Autoform для создания пользовательского интерфейса, а затем вставить все в 1 файл коллекции «Документы». Поэтому вопрос заключается в том, как получить URL-адрес S3 в параметре URL-адреса «Документы». Довольно тривиально ... но смотрел на него слепо. – wiwa1978

ответ

0

Существуют, по-видимому, пакеты автоматической форматирования, которые специально адресуют загрузку файла S3 (см. Раздел «Файлы» here), но поскольку вы, кажется, используете это как возможность обучения, я попытаюсь объяснить, d делать это с помощью основного метеор.

Но прежде, чем я забуду, ваш шаблон для загрузки - это ребенок #autoForm, но имеет собственный элемент form. Я думаю, что это приведет к тому, что сгенерированный HTML будет иметь вложенные элементы form (что нет-нет). Чтобы исправить это, я переместил бы {{/autoForm}} до {{> uploader}} и добавил обработчик событий для кнопки отправки, которая отправит форму, используя $('#documentForm').submit(). Примечание. Я не тестировал это.

Теперь, на ваш вопрос. Вы по сути спрашиваете, как изменить что-то в шаблоне (значение поля url) из события во вложенном шаблоне (шаблон uploader). Я бы сделать это следующим образом:

  1. Когда экземпляр родительского шаблона создается, прикрепить ReactiveVar к нему, который будет содержать URL загруженного файла.

    Template.adminDocumentNew.onCreated(function() { 
        this.url = new ReactiveVar(); 
    }); 
    
  2. Предоставьте помощника, чтобы получить реактивную переменную.

    Template.adminDocumentNew.helpers({ 
        url: function() { 
        return Template.instance().url; 
        } 
    }); 
    
  3. Используйте хелпер для установки значения в форме.

    {{> afQuickField name='url' value=url.get}} 
    
  4. Pass реактивного вара в шаблон загрузчика в качестве контекста данных:

    {{> uploader urlVar=url}} 
    
  5. Используйте реактивный вар, чтобы установить URL, когда загрузка заканчивается (где-то в upload-to-amazon-s3):

    template.data.urlVar.set(url); 
    

Я создал a meteorpad, который демонстрирует основная идея вне контекста autoform и S3.