如何使用Groovy从URL下载ZIP文件?附测试URL与代码片段
完善Groovy ZIP文件下载代码
我来帮你把这段代码补全,不仅能完成基本的ZIP下载,还会处理重定向、响应校验和异常情况,让代码更健壮:
完整实现代码
def static downloadArtifacts(String url, String filename) { // 递归处理重定向的辅助逻辑,处理3xx系列响应 def handleRedirect = { String currentUrl -> def conn = new URL(currentUrl).openConnection() conn.setRequestProperty("PRIVATE-TOKEN", "xxxx") int responseCode = conn.getResponseCode() // 检查是否为重定向响应 if (responseCode in 300..399) { String redirectUrl = conn.getHeaderField("Location") // 关闭当前连接的流,避免资源泄漏 conn.inputStream?.close() conn.errorStream?.close() // 递归跟进重定向地址 return handleRedirect(redirectUrl) } return conn } try { def conn = handleRedirect(url) // 校验响应是否成功(2xx系列状态码) if (conn.getResponseCode() >= 200 && conn.getResponseCode() < 300) { new File(filename).withOutputStream { out -> conn.inputStream.with { inp -> // 完整拷贝输入流到文件输出流 out << inp out.flush() } } println "✅ ZIP文件已成功下载至: ${filename}" } else { throw new IOException("❌ 下载失败,响应码: ${conn.getResponseCode()},消息: ${conn.getResponseMessage()}") } } catch (IOException e) { println "⚠️ 下载过程出错: ${e.message}" throw e // 可根据业务需求选择是否抛出异常,还是仅记录日志 } }
代码说明
- 重定向处理:原代码只获取了重定向地址但未实际发起新请求,新增的
handleRedirect闭包会递归跟进所有3xx重定向,确保最终连接到真实的文件地址 - 响应校验:加入了状态码检查,只有成功的2xx响应才会写入文件,避免下载错误内容
- 资源管理:利用Groovy的
with语句自动管理流资源,重定向时手动关闭旧连接的流,防止资源泄漏 - 异常处理:捕获IO异常并给出友好提示,同时可选择将异常抛出给调用方处理
测试调用示例
// 替换为你的目标URL和输出文件名 def targetUrl = "https://gist.github.com/daicham/5ac8461b8b49385244aa0977638c3420/archive/17a929502e6dda24d0ecfd5bb816c78a2bd5a088.zip" def outputPath = "my_downloaded.zip" downloadArtifacts(targetUrl, outputPath)
注意事项
- 记得把代码中的
"xxxx"替换为实际有效的PRIVATE-TOKEN(如果目标URL需要认证的话,公开Gist链接可能不需要) - 确保程序有写入
filename指定路径的权限 - 如果担心无限重定向,可以在
handleRedirect中加入重定向次数限制(比如最多5次)
内容的提问来源于stack exchange,提问作者SP.
相关产品推荐
相关产品推荐

