如何使用dojo.io.iframe.send取消文件上传?

时间:2008-11-15 00:41:02

标签: ajax iframe post upload dojo

我正在使用dojo.io.iframe.send方法将文件发送到我的服务器。我想提供一种方法,用户可以在发送过程中取消发送,以防用时太长或用户意识到她发送了错误的文件。

我无法想办法做到这一点。如果花费很长时间(即服务器没有快速响应),我可以使用超时终止发送,但这不是我想要的。我想在用户做出手势的任何时候终止(例如点击“取消”按钮。

谢谢!

4 个答案:

答案 0 :(得分:3)

出于安全原因,JavaScript甚至无法访问您发送的文件。所有文件上传均使用表单完成,并由浏览器直接处理。据我所知,没有直接的界面来监控上传的进度,也没有影响它的方式(例如,取消它)。

导航可能有所帮助,但仍然需要浏览器来中断传输 - 没有规范。

总结一下:不可能以便携式方式在JavaScript中做到可靠。这意味着Dojo不提供此功能。

答案 1 :(得分:3)

您好我知道这是一个相当晚的回复,所以我希望您或通过谷歌偶然发现的人会对此有所帮助。

可能取消iFrame中的文件上传,在Firefox中,您可以在iFrame上调用方法window.stop()。然而,IE没有这种方法,但随execCommand("Stop")一起提供,但是由于手动按停止甚至不起作用,脚本停止也不会。

我的第一次尝试涉及将iFrame的位置设置为about:blank,但遗憾的是无济于事。但是,浏览到具有正文的来源将取消 iFrame POST!

答案 2 :(得分:2)

所以我意识到这是一篇非常老的帖子(4年!),我正在回答。但是,当我在谷歌搜索一个应该具有的答案时,我发现它在回想起来是显而易见的,但在这里没有得到回答(我也没有回答过)。所以,为了下一个贫穷的俱乐部:

如果(像我一样),你不关心实际停止文件传输,但只是想让dojo.io.iframe生命移动(从用户的角度有效取消),你可以简单地忽略延迟回调的结果。但是,如果您还想通过dojo.io.iframe上传其他内容,则还必须使此dojo.io.iframe也忽略该结果。要做到这一点,这很烦人...... dojo.io.iframe.send()调用返回延迟。如果您要取消上传,dojo.io.iframe将执行后续排队的发送呼叫(因为它一次只能执行一次),您只需要在延迟时调用.cancel()来自当前正在进行的发送。

如:

    var dfd = dojo.io.iframe.send({...});
    var dfd2 = dojo.io.iframe.send({...}); // this send will not start until the first one completes. it is blocked internally by dojo.io.iframe.

...

现在,用户点击某个地方的取消按钮,因为上传时间太长,或者他们意识到他们并不打算上传所选文件。我们不想等到第一次文件传输完成,因为我们不再关心那个传输结果了。

onclick: function() {
    dfd.cancel();
}

在dfd上调用cancel将允许第二个send()调用立即执行。如果你在小提琴手中观看,你会看到第二个上传现在立即开始,而不是等待第一个(取消的)完成,因为它可以在没有调用延迟的.cancel()的情况下完成。

在不取消第一次延期的情况下,dojo.io.iframe将继续尽职地等待第一次上传的结果,从而阻止等待通过{{1}处理的所有后续排队send()次来电}。

答案 3 :(得分:0)

朋友所做的只是在取消按钮被预置时重新加载网页(我想通过调用document.location.refresh函数)。 还有一种方法可以监控上传的进度(有进度条),但它依赖于服务器(在我看到的情况下,它是一个apache模块,然后你会轮询指定链接和服务器上的进度)将返回进度)。