当前位置: 首页 > 知识库问答 >
问题:

javascript - fetch 如何发送复杂表单到PHP后台,接收并存储?

文增
2023-09-18

请问:一个表单里既有普通字段,也有一个文件上传的字段,是否可以使用fetch实现提交表单?
前提是使用 json 格式发送,也就是说文件的字段需要转换成字符串。

后台 PHP 使用 file_get_contents('php://input'), true) 进行接收。

请问该把需要上传的文件转换成什么?目前只知道图片可以转成 base64 ,那如果是其他格式呢,比如压缩包应该怎么整?

是不是这类不仅仅是文件上传的表单,不适合使用 fetch 进行操作。
从网上已经查过一些资料,但是并没有找到。

部分参考
https://blog.51cto.com/lxw1844912514/2941481

https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refer...

共有3个答案

岳华灿
2023-09-18

一般的设计都是会为文件上传提供单独的接口,而不是和表单放在一起。

按照你上面的做法,对于任何文件,你都可以把他转为 base64 的方式,然后嵌在 json 里面当成普通字符串发送出去。

但是这样会面临一个最直接的问题,就是文件的体积会增加 30%,这是 base64 带来的问题,而且浏览器可能还需要 100%(打开文件) + 130%(转为 base64) 的内存来满足你的需求,如果文件过大,可能直接导致浏览器卡住、甚至崩溃。同时网络上传也可能需要额外约 30% 的时间来处理。

这是从性能上的考虑。

其次,再从业务角度考虑。

以常见后台表单为例,一般表单项都会很多,假设因为用户填写的某些表单项不符合后端的验证规则,那就意味着,每一次你都需要把这个文件传到后端去,后端即使不去转存这个文件,这个文件也会被保存在临时文件中去,造成额外的消耗。

所以,一般情况下,对于文件上传都是提供单独的接口,使用标准的 FormData。


对于一些特别的格式,比如图文混排中的图片,就可能会直接返回图片地址,以便于在混排的时候,能够准确的知道加入的图片在什么位置。

当然,你也可以返回文件 ID,只是不便于前台展示预览。

如果你是想为了安全,那你可以把地址、ID 放到 Session 里面,在表单提交验证通过后,再在后台填入。

太叔昊穹
2023-09-18
  1. 一般来说不建议把复杂的表单混着文件上传一起做
  2. 最好单独做一个上传功能,上传完成后,把文件地址保存到表单里
  3. 然后一起提交一个大 json
  4. 否则万一文件上传失败,整个表单都要重新上传,很容易出问题
公冶高义
2023-09-18

根据您提供的信息,您可以使用fetch API将复杂表单发送到PHP后台,并使用file_get_contents('php://input')接收并存储。

对于文件上传字段,您可以将文件内容转换为base64编码字符串,然后将其作为json格式的表单数据的一部分发送到后台。您可以使用FileReader API读取文件内容,并将其转换为base64编码字符串。

对于其他格式的文件,例如压缩包,您可以使用JavaScript中的File API来读取文件内容,并将其转换为base64编码字符串。然后,您可以将该字符串作为json格式的表单数据的一部分发送到后台。

需要注意的是,使用fetch API发送文件数据可能会受到浏览器的安全限制。在某些情况下,浏览器可能会阻止跨域请求中包含二进制数据,这可能导致文件无法正确地传输到后台。

如果您需要处理文件上传表单,您可能需要使用其他方法,例如XMLHttpRequest或第三方库,例如axios。

 类似资料:
  • 我正在尝试将一个复杂的对象从服务器传递到客户端。我的客户端代码如下所示: 而类是: 在服务器上,我使用: 但不管用。如果我从 (“newsearch”上的

  • 我试图插入javascript varaible到php mysql,但它不是插入。 我该怎么办?

  • 我不明白为什么Javascript提取API顽固地拒绝保留我的PHP会话。下面是一个最小的测试: 我发现了几个类似的问题/答案,但没有一个有用。建议的解决方案是为凭证选项提供“包含”或“同一站点”,但它们都不起作用。 我知道我可以传递会话ID,但如果可能,我希望避免它。 谢谢你的帮助

  • 我从新的谷歌通知服务Firebase Cloud Messaging开始。我能够从Firebase用户控制台向Android设备发送通知以进行测试。 我正在努力解决的问题是,我无法通过控制台发送复杂的结构化数据 是否有任何方法可以使用Firebase控制台发送具有嵌套属性的通知?

  • 问题内容: 问题 我有一个表单,提交后将运行基本代码来处理提交的信息,并将其插入数据库中以显示在通知网站上。此外,我还有一个列表,他们注册了通过电子邮件和SMS消息接收这些通知的人员。此列表暂时是微不足道的(仅推送约150个),但是足以导致花费一分钟以上的时间在整个订户表中循环并发送150多个电子邮件。(由于批量电子邮件政策,电子邮件是根据我们的电子邮件服务器的系统管理员的要求单独发送的。) 在此