javascript - 发送对象数组的正确方法是什么,其中对象的一个属性的值必须是文件?
问题描述
我正在尝试将一组对象上传到后端,这些对象具有以下形式,{name: string, date: string, file: File}
. 使用 Fetch API 发送对象数组的正确方法是什么,其中对象的属性之一的值必须是文件?
async function onSubmit(event) {
event.preventDefault();
const files = Array.from(event.target.file.files);
const validFiles = getOnlyValidFiles(files);
if (!files.length || !validFiles.length) {
console.log("No data to submit");
return;
}
const data = validFiles.map(getFileMeta);
const response = await fetch("/api/v1/upload/files", {
method: "POST",
headers: {
"Content-Type": "application/json;charset=utf-8",
},
body: JSON.stringify(data),
});
const json = await response.json();
console.log(json);
}
获取文件元
function getFileMeta(file) {
let [article, date] = file.name.split("_");
date = date.split(".")[0]; // exclude .pdf
const formData = new FormData();
formData.append("file", file);
return {
article,
reception,
file: formData,
};
}
乙
解决方案
您不能通过 JSON 发送内容类型为 text/json 的文件。你可以序列化它虽然我猜这可能会让你更接近,但你会想要使用FormData(并将每个文件和内容附加到数组中)。我想您可以使用引用指针并尝试在 JSON 对象本身中引用文件,但我怀疑这实际上会起作用(除非您有办法将 JSON 对象解析为后端的 JS 对象以获取该引用返回- 我想这会起作用吗?)。无论哪种方式,您都需要多部分表单内容类型来发送此文件。
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#uploading_a_file
推荐阅读
- angular - Angular Agm/core map 不能与 observable 一起使用异步显示地图并动态添加标记
- sapui5 - 如何在ui5中创建全局变量?
- r - 将日志文件中的多行消息加入 R 中的单行
- python - django:无法重定向到 django 中的另一个视图
- sql - 使用 Coalesce 后在 PostgreSQL 9.2 数据库的联接查询中没有返回结果时返回 0
- php - Laravel 5.6 - 用户角色和权限(ACL)使用 Spatie 教程
- c++ - gdb 为具有虚函数的类打印非字符串值的静态 const 数组的无效地址
- angular - PrimeNG 使用异步管道延迟加载数据
- symfony - Twig 错误 - Sonata Admin 不存在变量
- javascript - 防止手机键盘打开时安装在 react javascript 中并在点击时启用