Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Strapi-如何上传文件并同时创建新的模型条目?_Javascript_Typescript_File Upload_Strapi - Fatal编程技术网

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

Javascript Strapi-如何上传文件并同时创建新的模型条目?,javascript,typescript,file-upload,strapi,Javascript,Typescript,File Upload,Strapi,在我的应用程序中,我希望像在管理面板中一样。我有一个包含其他数据+文件的表单,我想一次创建所有内容。由于新条目尚未创建,如果我不知道RefID,该如何做。我已经尝试了很多东西,但到目前为止没有任何效果。下面是代码示例: 表格: jobsForm = this.fb.group({ nom: [null], date: [null], address_chargement: [null], address_dechargement: [null], cli

在我的应用程序中,我希望像在管理面板中一样。我有一个包含其他数据+文件的表单,我想一次创建所有内容。由于新条目尚未创建,如果我不知道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存储创建操作,该操作调用我的服务,如下所示:

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);
}

或者它就是不上传。

我想这样做是不可能的。我建议将创建
作业过程分为两个步骤:

  • 创建
    文件
    ->
    发布/上传
  • 使用
    id
    FileResponse
    ->
    POST/Job
    创建
    Job
  • SQLITE\u错误通知您,
    作业
    模型没有
    字段
    ,因为
    作业
    模型接受
    refId
    文件

    您可以使用
    switchMap
    合并两个可观察对象


    这是可能做到的

    默认情况下并非如此,您必须在控制器/服务中进行一些更新

    content manager能够在同一请求中管理条目创建和文件上载。让我们在创建操作中复制这个逻辑

    注意:您必须发送带有
    FormData
    -以前不是此类请求的请求

    下面是创建条目的控制器函数

    下面是创建和上传文件的服务功能

    首先,您必须创建一个名为
    addAndUpload
    的新服务函数

    async addAndUpload(ctx) {
      // Get form data
      let 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
    controller函数中,您必须调用
    strapi.api.job.services.addAndUpload(ctx)
    而不是
    add
    函数。

    谢谢您的输入。我本来不希望在Strapi中编写任何自定义内容(这就是我选择使用它的原因)。我在我的工作表单组件中采取了另一个方向,在文件选择中,我将文件附加到一个新的表单数据中,并直接将其发送到上传。作为回报,我得到了所有上传的带有ID等的文件,我在提交时将这些文件添加到我的表单中,以创建对新作业中图像的引用。我有一个数组跟踪添加的文件,这样我就可以从表单和服务器中删除它们。如果表单被中止,请销毁Ngondestory中所有上传的文件。好的!这是另一种管理方法。无论如何,如果需要的话,这是一个很好的资源。
    async addAndUpload(ctx) {
      // Get form data
      let 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,
      });
    }