Strapi-如何同时上传文件和创建新模型条目?

时间:2019-06-16 20:39:02

标签: javascript typescript file-upload strapi

在我的应用中,我希望像在管理面板中那样进行操作。我有一个包含其他数据和文件的表单,我想一次创建所有内容。如果由于尚未创建新条目而不知道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 个答案:

答案 0 :(得分:2)

可以这样做。

默认情况下不是,您将必须在控制器/服务中进行一些更新。

内容管理器具有在同一请求中管理条目创建和文件上传的功能。因此,让我们在您的create动作中复制此逻辑。

注意:您必须发送带有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 :(得分:1)

我认为不可能那样做。我建议将创建Job的过程分为两个步骤:

  1. 创建File-> POST /upload
  2. Job-> id中使用FileResponse创建POST /job

SQLITE_ERROR通知您Job模型没有fields,因为Job模型接受refIdFile

您可以使用switchMap合并两个Observable。

File Upload