如何解析txt文件后通过multipart方式发起POST上传请求
表单上传文件前置修改的实际可行性说明
两种常见实现尝试的生效判定
- 直接给文件输入框的files属性赋值的写法
这种写法无法正常生效。根据DOM规范,FileList对象是只读结构,不支持通过索引直接修改数组中的文件项,浏览器会直接拦截这类赋值操作,原生表单流程读取到的依然是用户最初选择的原始文件。 - 调用
FormData.set修改对应字段文件的写法
这种写法可以正常生效。只要拦截了表单的默认提交行为,手动构造FormData发起multipart格式的POST请求,就可以完全自由替换对应字段的文件内容,甚至自定义上传时携带的文件名,不受文件输入框只读属性的限制。
实现过程的常见注意点
- 如果没有拦截表单的原生
submit事件,就算手动修改了FormData对象,原生提交流程也不会读取你修改后的内容,依然会按输入框中存储的原始文件执行上传。 - 做编码转换的核心逻辑是:通过
FileReader读取用户选择的原始文件的ArrayBuffer内容,用TextDecoder按照源文件的实际编码(如CP437)完成文本解码,再将解码后的内容重新编码为UTF-8格式,生成新的File对象作为实际上传的文件。 - 你当前提供的XMLHttpRequest实现存在一处小的代码笔误:函数形参是
newFile,但append到FormData时使用了未定义的变量file,实际运行会触发报错,将该处改为fd.append('myFile', newFile)即可正常运行。
上传流程优化提醒:如果需要在用户上传前处理文件内容,一定要在文件读取解析完成前禁用提交按钮,避免用户在文件未处理完成时提前触发上传。
内容的提问来源于stack exchange,提问作者Sturm
相关产品推荐
相关产品推荐

