You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JS程序化设置文件输入框值以提交大二进制对象?

问题描述

我需要通过<form>提交大型二进制对象,旧实现是把对象转成Base64字符串放在<input type="hidden">里提交,但Base64会让数据体积膨胀30%左右,导致请求超出了Web服务器的大小限制。想改用<input type="file">直接提交原始二进制数据来避免这个问题,请问这种方式可行吗?

当前使用的代码如下:

function submitToServer(evt) {
  evt?.preventDefault?.()

  const myForm = document.querySelector('form#RequestModal'),
    data = new FormData(myForm)

  let fetchData = [
    fetch(_API_ENDPOINT_ + '/path/to/controller', {
      method: 'POST',
      body: data,
    }),
    // 其他请求...
  ]

  Promise.all(fetchData)
    .then(([uploadRes, tokenRes, serversStatus]) => {
      // 处理响应...
    })
    .catch(E => {
      // 错误处理...
    })
}

表单里原本有多个通过JS程序化填充的隐藏输入框,我正尝试把这些字段替换成用CSS隐藏的文件输入框。补充说明:我不是想手动用FormData.append()添加Blob,而是希望把Blob直接放进<input type="file">中,让原生FormData解析表单时自动收集Blob内容。


解答

直接通过JS把Blob塞进<input type="file">让FormData自动收集不可行——出于安全考虑,浏览器不允许脚本直接修改文件输入框的files属性,这个属性只能通过用户主动选择本地文件、或者拖拽上传等交互方式来填充,没法通过代码直接赋值Blob。

最终采用的替代方案

放弃了直接用文件输入框的思路,写了一个辅助函数来处理:

  • 函数接收目标<form>元素作为参数
  • 通过表单上预先设置的存储标识符,从关联的存储(比如内存缓存、localStorage)中取出对应的Blob
  • 手动将Blob追加到FormData对象中,再返回处理后的FormData

这个方案虽然比最初的想法多了几步逻辑,但项目里的新手也能轻松理解和维护。

另外,后续可能会发布一个不违反保密协议的简化版函数——这个方案的可定制性很强,只是受限于知识产权协议,暂时没法公开完整实现。


内容的提问来源于Stack Exchange,提问作者Perritu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:57:35