gpt4 book ai didi

java - 尝试下载远程图像时出现 403

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:23 25 4
gpt4 key购买 nike

我正在尝试从某些网址下载图片。对于某些图片,它工作正常,但对于其他图片,我收到 403 错误。

例如,这个:http://blog.zenika.com/themes/Zenika/img/zenika.gif

此图片访问不需要任何身份验证。您可以自己单击该链接并使用 200 状态代码验证您的浏览器是否可用。

以下代码产生异常:new java.net.URL(url).openStream()。与 org.apache.commons.io.FileUtils.copyURLToFile(new java.net.URL(url), tmp) 相同,它使用相同的 openStream() 方法引擎盖。

java.io.IOException: Server returned HTTP response code: 403 for URL: http://blog.zenika.com/themes/Zenika/img/zenika.gif
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626) ~[na:1.7.0_45]
at java.net.URL.openStream(URL.java:1037) ~[na:1.7.0_45]
at services.impl.DefaultStampleServiceComponent$RemoteImgUrlFilter$class.downloadAsTemporaryFile(DefaultStampleServiceComponent.scala:548) [classes/:na]
at services.impl.DefaultStampleServiceComponent$RemoteImgUrlFilter$class.services$impl$DefaultStampleServiceComponent$RemoteImgUrlFilter$$handleImageUrl(DefaultStampleServiceComponent.scala:523) [classes/:na]

我使用 Scala/Play Framework 进行开发。我尝试使用内置的 AsyncHttpClient。

// TODO it could be better to use itetarees on the GET call becase I think AHC load the whole body in memory
WS.url(url).get.flatMap { res =>
if (res.status >= 200 && res.status < 300) {
val bodyStream = res.getAHCResponse.getResponseBodyAsStream
val futureFile = TryUtils.tryToFuture(createTemporaryFile(bodyStream))
play.api.Logger.info(s"Successfully downloaded file $filename with status code ${res.status}")
futureFile
} else {
Future.failed(new RuntimeException(s"Download of file $filename returned status code ${res.status}"))
}
} recover {
case NonFatal(e) => throw new RuntimeException(s"Could not downloadAsTemporaryFile url=$url", e)
}

使用此 AHC 代码,它可以正常工作。有人可以解释这种行为以及为什么我使用 URL.openStream() 方法时会出现 403 错误吗?

最佳答案

如前所述,一些托管商使用 UserAgent 等 header 来防止这种入侵:

这行不通:

   val urls = """http://blog.zenika.com/themes/Zenika/img/zenika.gif"""
val url = new URL(urls)
val urlConnection = url.openConnection()
val inputStream = urlConnection.getInputStream()
val bufferedReader = new BufferedReader(new InputStreamReader(inputStream))

这个有效:

val urls = """http://blog.zenika.com/themes/Zenika/img/zenika.gif"""
val url = new URL(urls)
val urlConnection = url.openConnection()
urlConnection.setRequestProperty("User-Agent", """NING/1.0""")
val inputStream = urlConnection.getInputStream()
val bufferedReader = new BufferedReader(new InputStreamReader(inputStream))

关于java - 尝试下载远程图像时出现 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22958559/

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