【问题标题】:Slow file upload: Can I remove file attachment from multipart POST data on the fly and just submit form text fields?文件上传慢:我可以即时从多部分 POST 数据中删除文件附件并仅提交表单文本字段吗?
【发布时间】:2012-11-21 05:27:05
【问题描述】:

我有一个常规的 JSP/Servlet/Java Web 应用程序,用于从移动设备上传图片。我正在使用 Apache Commons 库进行上传。应用程序托管在 WebSphere Application Server 7.0 上。

一切正常,如果用户有非常好的/强信号/连接或良好的 WiFi,他可以上传几张总计 8MB 或更多的图片。

当用户位于 3G/4G 信号/连接不佳的位置时,就会出现问题。他收到诸如“非法状态异常”或一些超时错误之类的错误,在某些情况下,移动浏览器只是停留在提交页面上,进度条不再移动。

关于如何“优雅地”处理这个问题有什么建议吗?就像有没有办法在设定的时间后进行干预并让用户可以选择提交没有文件附件的表单(即只提交表单文本字段)?也欢迎任何其他建议。

更新: 下面的 setTimeout 解决方案对我有用。另一个缺失的部分是我必须发出“浏览器停止”命令来停止正在进行的原始提交,然后才能发出重新提交。否则,我的重新提交命令将被浏览器忽略。

【问题讨论】:

  • 您可以调整任何 conf 参数以延长超时时间吗?
  • 会话超时在 WAS7 中设置为 30 分钟。但我正在寻找的是一种在会话超时之前干预上传方式中间的方法。比如说,10 分钟后,如果文件仍在上传,我会显示一个对话框,让他选择提交不带文件附件的表单。
  • 大多数浏览器在整个请求发送之前不会从服务器读取,所以你想做的事情会非常困难。
  • @irreputable 不,不是真的。让我回答这个问题:)
  • @naugtur - 是的,需要客户端魔法来实现它。

标签: java javascript servlets upload websphere


【解决方案1】:

这里的用例很简单 - 如果上传未在 N 分钟内完成,请使用 javascript 删除/清除该字段并重新发送表单。

在基本实现中你不需要控制上传,只要安全地假设如果你设置了超时重新发送,那么如果第一次尝试成功并且页面重新加载就不会发生。

jQuery 伪代码:

setTimeout(function(){
  $imageFieldNode.remove();
  $form.trigger('submit');
},30000);//after 30 seconds

更高级的方法是使用现成的解决方案进行受控上传。他们是这样工作的:

  1. 上传开始
  2. js 以 GET 查询间隔提示服务器以获取已接收内容的大小。
  3. 每次获取信息时,都会报告进度。

您可以使用这些库做很多事情。

【讨论】:

  • 我刚刚尝试了 setTimeout 方法,我从表单中清除图像文件元素并触发重新提交。问题是第二次提交尝试不会影响或不会取消原始提交。上传仍在继续,原始/未修改的 POST 数据仍然是提交的数据。
  • 更新:我只需要在重新提交之前发出“浏览器停止”命令。
  • 可以,也可以在成功后使用AJAX和window.location.href=somewhere
【解决方案2】:

您可以考虑流行的网络邮件客户端中使用的方法(将文件附加到邮件时):

文件是在表单提交之前独立上传的(即之前),使用 javascript。每个文件都存储在一个临时目录中,上传成功后,用户可以继续操作。 上传状态会显示给用户,如果上传失败,主要操作(表单填写/提交)不会被中断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 2016-04-08
    • 2011-12-30
    • 2017-05-11
    • 2021-12-31
    • 2012-07-29
    相关资源
    最近更新 更多