springboot web 大表单多文件接口设计问题

251 天前
 9fan

springboot web 项目,现有一个要求,一个创建项目表单中,有十几个字段,其中有些是文件,而且不同文件之间是有不同的,意思是后端必须知道哪个对应哪个文件,业务要求,没办法,现在需要设计这个接口,麻烦问下,有什么好的解决方案。 方案一:使用 POST requestBody body 中让前端把文件作为 byte[]进行传递,应该是可以的

不知道大家有没有比较高效的方案

2185 次点击
所在节点    程序员
42 条回复
wuyiccc
251 天前
单独提供文件转 url 接口,表达字段填文件的 url
9fan
251 天前
设计系统的只支持上传项目内的文件,不被允许此类调用。意思是系统内的文件上传必须携带项目相关的信息,领导设计如此,反驳几次无法撼动,而且文件上传是他所写,所以协调不了
thevita
251 天前
嗯,,啥意思,是我没理解对么,“后端必须知道哪个对应哪个文件” 是啥意思,就是后端能上传多个文件?,,

这本来就可以啊,挑战在哪??
vagusss
251 天前
上传接口单独做,返回文件 id 或者路径之类的, 然后最后统一和参数一起提交.
vagusss
251 天前
@vagusss 这样你还可以给文件上传搞个进度条之类的, 上传的过程中不影响填写其他表单参数
cheng6563
251 天前
multipart/form-data 不是本来就能传多个文件多个参数。
unclema
251 天前
主流方案不都是文件服务都是单独去处理吗
1. 上传到本地文件服务器或 OSS 中去
2. 上传接口后端处理完成后返回文件地址
3. 表单提交的时候存储文件 ID 或者这个文件的地址
4. 预览的时候根据 ID 或地址去拿就行了哇
后端必须知道哪个对应哪个文件: 每个类型的文件单独一个字段不就可以了吗.
9fan
251 天前
@cheng6563 multipart/form-data 是可以上传多个文件,但是文件无法进行业务上的区分。
@vagusss 如果单独做,那这种临时文件需要单独去开发,去做存储。还要考虑后期定时删除废文件
我的意思能否有优雅的设计方案
wxb2dyj
251 天前
说实话,我建议你先学会如何描述问题。你这描述怎么跟领导沟通清楚
thevita
251 天前
@9fan
嗯.......

你这里的 “文件无法进行业务上的区分” 是啥意思, 是上面说的 “哪个对应哪个文件”,没问题啊

给个 curl 你试试就知道了: curl http://localhost/upload -Ffile1=@log -Ffile2=@image.png

不知道是不是理解错了,我感觉你被网上的信息误导了
9fan
251 天前
@unclema 是的,目前就是每个类型的文件对应一个字段这样做的。主流方案大家都赞同,由于领导个人影响力太强,我们无法更改,前端一直骂娘,一个文件上传调 6 个接口,我们没办法决定
9fan
251 天前
目前是 POST http://localhost/project/create (@ModelAttribute ProjectCreateRequest request)

request {
field1,
field2,
field3,
......
// 领导立项文件
List<FileDto> file1;
// 领导会议纪要
List<FileDto> file2;
// 其余补充文件
List<FileDto> file3;
}

类似这样的,由于文件太多,且这种会慢,有没有更好的方法
limaofeng
251 天前
@wxb2dyj 真相了
@9fan 这有啥好纠结的,这么被动,领导设计,你无法撼动,而又没有能力说服领导采纳你的方案(前提你得有),那还有啥好商量的,领导咋说你咋干不就成了。不懂问领导,即使再沙壁的方案,也是正道
9fan
251 天前
感觉这下子应该说清楚了,下次还是应该直接上 demo
zpf124
251 天前
“是可以上传多个文件,但是文件无法进行业务上的区分”

你们是不会给 MultipartFile 加 @ RequestParam 或者 @ RequestPart 注解? 还是说不知道 这个注解可以指定 key ?
9fan
251 天前
@zpf124 文件个数是不确定的
xiangyuecn
251 天前
这不是设计问题,是压根没有设计😅
limaofeng
251 天前
@9fan 一个请求附带 N 多文件,而不是单独上传后的文件 ID 。那这个表单到 controller 一定比 只携带文件 ID 的请求慢。这个没法解决。
如果文件单独上传。在客户填写表单时,文件已经上传了。而且为了容错。可以支持多个文件同时上传,端点续传等功能。
但如果非要和业务表单同时上传文件。这个表单就是所有文件要传输的大小。你网络好,文件大的不是很过分,也没啥问题。


所以你的问题,更本就不是你能解决的。你无法改变方案。

"文件个数是不确定的" ? 这个影响吗? 真正影响速度慢的是文件大小以及网络。 "文件个数是不确定的" 只影响你后端如何处理这个表单中的文件 key 按什么规则匹配到业务场景
9fan
251 天前
@xiangyuecn 你真懂,我们都这么觉得的,小伙子,有无好的方案呀,贡献一波,一看你就是大佬,好让我来喷一下领导,虽然我一直赞同文件服务不管业务,只管上传,以及中间增加过滤规则拦截规则之类的
9fan
251 天前
@limaofeng 可否先让后端业务这边单独写个文件暂存的功能返回文件 key ,其实不走文件服务,后续在提交表单时只传与这个表单对应的 key ,这里头可否有问题,比如怎么知道是这个表单的文件 key ,而不是别的表单的文件 key ,后期当前表单提交后,找出临时文件 key 的文件去调用文件服务去上传,最后再删除这个临时表的文件 key 及临时文件。其中的问题应该怎么解决,是不是增加了复杂性了

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

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

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

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

© 2021 V2EX