multipart/form-data断点上传问题

poikillll 2013-06-05 05:52:46
我有一个云盘项目,需要从页面上传用户个人文件到服务端,此时页面应该用multipart/form-data来提交数据,如下:
<form id="uploadFile" action="portal/admin/batchsms/importcontact/" method="post" enctype="multipart/form-data" target="hidden_frame">
<input type="file" name="file" id="importFile"/>
</form>

controller文件大致如下:
@RequestMapping(value = "/importcontact", method = RequestMethod.POST)
public void importContact(@RequestParam(value = "file") MultipartFile file,
PrintWriter out, HttpServletRequest request) {
logger.debug("start process ...");
dosomething...
}

上传文件支持大文件,此时选择一个文件时点击上传提交时,发现这个文件是整个上传到服务器后才执行controller,才打印出start process...

这里有几个问题想问下高人
1:这个文件是以什么形式上传到服务器的?以临时文件存放还是以字节流形式保存在内存中?
2:这样情况下,一旦抛异常,超时,文件就必须重新传了,因为传的过程中不知道从何处去控制,此时该如何实现上传暂停功能?
...全文
174 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
kittaaron 2013-06-05
  • 打赏
  • 举报
回复
1.以前也没有研究过,不过这是个普遍的问题,应该可以google到不少答案。随便搜了一下,楼主看一下:http://serverfault.com/questions/13523/configure-tomcat-to-use-a-different-temp-directory-for-file-uploads google关键字:tomcat upload temperary directory 2.如果http server是自己实现的,就可以考虑这个问题了。或者还有种情况,楼主对上传的文件做了切分处理,比如处理到文件的offset=10000的时候,出错了,server上已经把前8000的数据存了下来(假设是4000个单位处理一次),就可以发送一个消息告诉客户端可以从offset为8000的位置开始传。 但是在一般的Web客户端是浏览器的情况下,除非主动去问是不是数据已经在服务器上存在了,不然这个功能也是不实用的
poikillll 2013-06-05
  • 打赏
  • 举报
回复
kittaaron你好, 1 是不是不同的服务容器会存放在不同的临时目录中?我找了很多都没看到,比如说tomcat,resin,jetty等都没有说到http multipart的临时目录在哪 2 既然也是整个文件push到server的某个临时目录后,再做处理,那此时文件都已经是完整的,还有做断点的意义吗?
kittaaron 2013-06-05
  • 打赏
  • 举报
回复
1.上传文件就是http multipart的方式传到服务器的,http server的实现会把传过来的数据存到临时文件中(这个看http server的实现,我觉得不会有哪种server的实现会把文件全部放到内存中吧) 2.上传过程中,网络异常,重传是肯定的。因为你自己处理文件的逻辑还没有开始工作。楼主如果想要在传的过程中就记录文件内容,除非自己实现解析http multipart的内容,不然肯定是做不了的!如果想要做断点续传,可以利用http协议response返回代码100和206,楼主有兴趣可以看一下。这个也只是在整个文件push到server的某个临时目录后,你再自己处理的过程中做的!

51,410

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧