Strapi - Как я могу загрузить файлы и создать новую запись модели одновременно? - PullRequest
0 голосов
/ 16 июня 2019

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

Форма:

 jobsForm = this.fb.group({
    nom: [null],
    date: [null],
    address_chargement: [null],
    address_dechargement: [null],
    client: [null],
    completed: [false],
    status: ['waiting'],
    comment_user: [null],
    comment_admin: [null],
    files: [null],
});

Форма отправляется в NGRX Store для создания действия, которое вызывает мою службу следующим образом:

public createJob = (payload: IJob): Observable<IJob>  => {
    const data = new FormData();
    Object.entries(payload).forEach(([key, value]) => {
        data.append(key, value);
    });
    return this.http.post<IJob>(`${this.env.backendUrl}/jobs`, data);
}

Я получаю такие ошибки, как:

[2019-06-16T20:10:03.573Z] error Error: SQLITE_ERROR: table jobs has no column named fields

Или просто не загружается.

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Это возможно сделать.

По умолчанию это не так, вам придется делать некоторые обновления в ваших контроллерах / службах.

Менеджер контента имеет возможность управлять созданием записейи загрузка файла в том же запросе.Итак, давайте скопируем эту логику в ваше действие создания.

Примечание: вам нужно будет отправить запрос с FormData - такого запроса раньше не было.

Вот функция контроллеракоторые создают запись https://github.com/strapi/strapi/blob/master/packages/strapi-plugin-content-manager/controllers/ContentManager.js#L61

Вот сервисная функция, которая создает и загружает файлы https://github.com/strapi/strapi/blob/master/packages/strapi-plugin-content-manager/services/ContentManager.js#L63

Сначала вам нужно будет создать новую сервисную функцию с именем addAndUpload.

addAndUpload(ctx) {
  // Get form data
  const values = ctx.request.body;

  // Silent recursive parser.
  const parser = value => {
    try {
      value = JSON.parse(value);
    } catch (e) {
      // Silent.
    }

    return _.isArray(value) ? value.map(obj => parser(obj)) : value;
  };

  // Get files
  const files = values.files;

  // Get entry data
  values = Object.keys(values.fields).reduce((acc, current) => {
    acc[current] = parser(values.fields[current]);

    return acc;
  }, {});

  // Create the entry without files
  const entry = await strapi.api.job.services.add(values)

  // Then, request plugin upload.
  if (Object.keys(files).length > 0) {
    // Upload new files and attach them to this entity.
    // Here `job` have to be the model name
    await strapi.plugins.upload.services.upload.uploadToEntity(
      {
        id: entry.id || entry._id,
        model: 'job',
      },
      files
    );
  }

  return strapi.api.job.services.job.findOne({
    id: entry.id || entry._id,
  });
}

А в функции контроллера create вам придется вызывать strapi.api.job.services.addAndUpload(ctx) вместо функции add.

1 голос
/ 18 июня 2019

Я думаю, что это невозможно.Я предлагаю прервать процесс создания Job в два этапа:

  1. Создать File -> POST /upload.
  2. Создать Job с id из FileResponse -> POST /job.

SQLITE_ERROR сообщает вам, что модель Job не имеет fields, потому что Job модели принимают refId до File.

Вы можете использовать switchMap для объединения двух наблюдаемых.

Загрузка файла

...