确定资源是否可供下载的一种可能解决方案是打开与该资源的连接并检查响应代码。响应可以告诉您连接是否成功。我们可以假设如果连接成功,那么文件就可以下载了。成功的连接会发送一个响应代码 200。我们可以假设任何其他响应代码都意味着连接不成功。
为此,我们可以创建一个名为CheckResponseStatus的 servlet,如下所示:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String remoteImageUrl = request.getParameter("remoteImageUrl");
String imageUrl = "http://localhost:8000/WEBAPP/images/download.png";
URL url = new URL(remoteImageUrl);
HttpURLConnection http = (HttpURLConnection)url.openConnection();
int statusCode = http.getResponseCode();
if (statusCode != 200) {
imageUrl = "http://localhost:8000/WEBAPP/images/notAvailable.png";
}
response.getWriter().write(imageUrl);
}
我们将资源的 URL 作为查询字符串参数传递,并使用request.getParameter("remoteImageUrl")
. 然后我们打开到资源的连接url.openConnection()
并检索响应代码http.getResponseCode()
。
现在我们有了响应代码,我们对其进行测试以确定我们是否已成功连接到资源if (statusCode != 200)
。如果是这样,我们返回下载图像的 URL,否则返回不可用图像的 URL。
http://localhost:8000/WEBAPP/images/download.png
因此,如果资源可用,则此 servlet 将返回,或者http://localhost:8000/WEBAPP/images/notavailable.png
,如果不可用,则返回作为我们可以插入到<img src="">
标签中的文本字符串。
在 JSP 中,我们需要将资源的 URL 传递给 servlet。
<%
pageContext.setAttribute("FilePath1", "http://www.google.com/humans.txt");
pageContext.setAttribute("FilePath2", "http://www.example.com/filedoesnotexist.doc");
%>
<a href="${FilePath1}">
<img src="<jsp:include page="CheckResponseStatus?remoteImageUrl=${FilePath1}"/>"/>
</a>
<a href="${FilePath2}">
<img src="<jsp:include page="CheckResponseStatus?remoteImageUrl=${FilePath2}"/>"/>
</a>
在此示例中,我对 URL 进行了硬编码,并将它们作为属性添加到 pageContext。我已经这样做了,所以我们可以使用表达式语言而不是 scriptlet(不推荐使用 scriptlet)。
我使用标准操作<jsp:include>
来调用 servlet。此操作发出对 servlet 的调用,并且无论来自 servlet 的响应是什么,它都包含在已翻译的 JSP 页面中。资源的名称作为查询字符串参数附加到对 servlet 的调用${FilePath1}
。此查询字符串由 servlet 使用 检索request.getParameter("remoteImageUrl")
。
这行代码允许我们动态测试我们作为参数传递给 CheckResponseStatus servlet 的任何文件的连接状态。
这只是一个概念证明,可以进行实质性改进。我只包括了让它工作所需的最低限度。您将需要使其更健壮,处理异常和其他响应代码。
我希望这可以帮助您解决问题。