请教懂 js 代码的朋友一个问题, file 控件内容,如何用 js 来实时修改?

2020-01-29 22:20:22 +08:00
 mostkia

首先说明一下:
js 不会请求没有上传的文件名称,所以权限应该不会有问题。

遇到的问题:
因为客户需求,有多次选一个或多个文件,满意后点击上传到服务器的需求。所以对应的 FileList 是不断变化的,只有客户点击了“上传”按钮后 FileList 列表内的内容才能算数上传服务器。所以就产生了这个需求,因为 js 代码需要不断根据选择框内已有的内容(客户可能上传的内容不满意又删了的),不断修改 input 上传控件内的信息。但我发现 files 对象似乎是锁定的,key 也是数字类型的,似乎没法修改。具体是我的方法错了吗?

如下图:

不过类似 test3.files = test1.files 这种方法又的确额可以生效,说明该属性不是只读的,不知道为什么会这样,期待有懂这方面得朋友解答一下,是否有什么解决方案

1478 次点击
所在节点    问与答
6 条回复
ragnaroks
2020-01-30 01:51:11 +08:00
只需要一个 input,当用户选择文件后,直接在 onload 把文件读到内存
const filesArray=[];
input.onload=function(){ filesArray.push(file); }
用户删除的时候遍历并 slice 即可
ragnaroks
2020-01-30 01:52:09 +08:00
你可以参考下各种图床,可以选择很多文件,点了上传才真正上传,没上传之前可以删除,这差不多刚好和你的需求一致
mostkia
2020-01-30 10:06:13 +08:00
@ragnaroks 好的,谢谢。昨晚查资料查了很久,发现 FileList 列表的确是只读的,只能清空,不能修改。可能是考虑安全性的原因,所以,目前来看,只能自己创建一个文件列表了。通过 formData 方式上传。只不过这样兼容性可能会有影响,而且这样写出来的文件上传组件,无法作为其他表单的一个子功能调用( formData 只能储存在内存里,没法重新写回 input 里,单纯通过 submit 提交)我个人目前更偏向于使用 base64 方法,将需要的文件名、类型、大小之类的信息,和 base64 内容组成 json,实时存入 input 内回传回服务器。只是这种方法无法处理非常大的文件,比如一个 200mb 的文件,编码的时间将会非常的久。但因为是字符串类型的,处理非常方便所以通用性来讲的确更可靠一些。
Sendya
2020-01-30 10:22:26 +08:00
题主打算兼容 IE8 吗?
mostkia
2020-01-30 11:20:27 +08:00
@Sendya 主要是需要能兼容单独使用( ajax )和集成在其他表单中做子功能使用的场景,formData 方式没法反向写入到 input,纯表单模式下使用受限。至于兼容性,目前没考虑太多,能做到兼容自然最好,做不到也没事,一般 IE9 ( win7 系统)都快淘汰了。
w292614191
2020-01-30 20:20:02 +08:00
看起来,你需要一个文件上传插件。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/640897

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX