我正在尝试从用户那里一键下载多个 pdf 文件(在 Chrome 中工作)。一旦用户单击相关按钮,就会触发 for 循环来查看需要下载多少文档,每个文档都需要一个下载对话框。在 for 循环中,我模拟每个 pdf 的点击(这是通过 javascript 的点击事件完成的)。
Java servlet 代码如下:
out.print("<a id='exportAchievement' style='display:none' href='" + tempFileName + "'download='" + pdfName + "'></a>");
out.print("<script>document.getElementById(\"exportAchievement\").click();</script>");
这对于一个 pdf 来说非常有效,但是一旦我执行两个或更多,那么弹出的每个对话框都会使用第一个 pdf(名称和实际 pdf 与第一个 pdf 相同)。
我检查了我的变量是否混淆了,但是通过使用上述代码之前和之后的打印输出,它表明变量是正确的。
我的假设是错误出现在浏览器端,因为当需要下载一份 pdf 时对话框会工作,但我很困惑。
相关的for循环如下:
// pdfs.length determines the number of pdf's to download
for (int j = 0; j < pdfs.length; j++) {
if (pdfs[j].contains(".pdf")) {
try {
// build the path to the pdf
achFile = sub.getPath() + "\\" + pdfs[j];
// fills in relevant fields in the pdf
if (PDFFill.fillPDF(achFile, student, user, context)) {
String pdfName = student.getName() + "-" + achFile.substring(achFile.lastIndexOf("\\") + 1);
String tempFileName = Protocol.ACHIEVEMENT_PATH + "/" + pdfName;
out.print("<a id='exportAchievement' style='display:none' href='" + tempFileName + "' download='" + pdfName + "'></a>");
out.print("<script>document.getElementById(\"exportAchievement\").click();</script>");
} else {
this.printWithNoty("Could not print PDF. " + achievement, "warning");
}
} catch (NullPointerException n) {
System.out.println(n.getMessage());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
最佳答案
这是因为您对所有元素使用单个id
。 ID 是唯一的。如果您对所有内容都使用相同的 ID,则无法区分它们,因此您不能期望获得多个结果。
<a id='exportAchievement' ...>
您可以使每个元素的 ID 都是唯一的,然后它就应该可以工作。
关于javascript - 如何通过 Java Servlet 使用 anchor 标记允许多次下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24433856/