gpt4 book ai didi

java - 在响应文件下载时重新启用表单提交按钮

转载 作者:行者123 更新时间:2023-11-29 07:54:03 24 4
gpt4 key购买 nike

这可能是一个非常简单的问题,但实际上我还没有看到很多搜索结果。

我在表单中有一个非常基本的提交按钮,它接受一些用户输入,并在服务器的临时目录中生成一个可下载的文件,然后提示用户下载该文件,然后在提交时禁用该文件:

<form action="Home" method="post" onsubmit="Submit.disabled = true; return true;">
...
<input type="submit" name="Submit" value="Submit" id="Submit" />

我们需要在页面创建文件时将其禁用几秒钟,然后提示用户下载它。创建文件后,它会在我们的 SelectionServlet.java 中返回以下响应,以便浏览器可以下载此生成的文件,例如:

            if (Export.equals("PDF")){
response.setContentType(".pdf");
response.setHeader("Content-disposition", "attachment; filename="+Constants.FILE_NAME+".pdf");
File dlFile = new File(Constants.FILE_LOCATION+".pdf");

// This should send the file to browser
OutputStream outStream = response.getOutputStream();
FileInputStream in = new FileInputStream(dlFile);
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0){
outStream.write(buffer, 0, length);
}
in.close();
outStream.flush();
Export="HTML";
}

文件准备好下载后,我想重新启用该提交按钮,以便用户可以重新使用他们输入的表单数据(没有进行页面重定向,因为用户基本上只是选择了什么条件进入他们正在构建的文件,以及它是什么文件类型,提交按钮最终将我们带到一个连接到源的 java web 连接,并将各种文件类型构建到服务器的临时目录中以供下载用户)。

我在 Chrome 中玩过,我实际上可以删除提交按钮上的禁用属性,然后再次单击按钮但使用不同的条件并得到不同的结果。什么代码实际上可以做到这一点,我不确定。

最佳答案

在文件下载的响应上设置一个 cookie,并让 JavaScript 每隔一段时间检查 cookie。一旦文件下载准备就绪并因此发生另存为对话框,JavaScript 就可以使用该 cookie。为确保在同一 session 中跨多个浏览器窗口/选项卡正常工作,最好是在 JavaScript 中生成一个唯一 token ,将其作为请求参数传递给下载请求,并让 servlet 将其设置为 cookie 值。

基本上,应该这样做:

<form action="Home" method="post" onsubmit="startDownload(this)">
...
<input type="hidden" name="token" />
<input type="submit" name="Submit" value="Submit" id="Submit" /> <!-- I'd rather rename and lowercase the ID/name. -->
</form>

使用这个 JavaScript(当使用 jQuery 时,jquery-cookie plugin 可能有助于减少 document.cookie 的冗长):

function startDownload(form) {
var token = new Date().getTime();
form.token.value = token;
form.Submit.disabled = true;

var pollDownload = setInterval(function() {
if (document.cookie.indexOf("download=" + token) > -1) {
document.cookie = "download=" + token + "; expires=" + new Date(0).toGMTString() + "; path=/";
form.Submit.disabled = false;
clearInterval(pollDownload);
}
}, 500);
}

在 servlet 中:

// Prepare download here.
// ...

// Once finished preparing, set cookie.
Cookie cookie = new Cookie("download", request.getParameter("token"));
cookie.setPath("/");
response.addCookie(cookie);

// Now stream download to response.
// ...

关于java - 在响应文件下载时重新启用表单提交按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19163541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com