Javascript Strapi-如何上传文件并同时创建新的模型条目?
在我的应用程序中,我希望像在管理面板中一样。我有一个包含其他数据+文件的表单,我想一次创建所有内容。由于新条目尚未创建,如果我不知道RefID,该如何做。我已经尝试了很多东西,但到目前为止没有任何效果。下面是代码示例: 表格: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
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,
});
}