当前位置: 首页 > 面试题库 >

403当尝试下载远程映像时

徐麒
2023-03-14
问题内容

我正在尝试从某些网址下载图片。对于某些图片,它工作正常,但对于其他图片,我会收到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之类的标头来防止这种入侵:

这不起作用:

   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))


 类似资料:
  • 问题内容: 我正在编写Django应用程序,它将获取特定URL的所有图像并将其保存在数据库中。 但是我没有在Django中使用ImageField。 Settings.py models.py download_img.py 我正在像这样的一个视图内调用download_imgs.py 问题答案: Django Documentation总是一个很好的起点 更新 因此,此脚本有效。 循环播放图片以

  • 我正在尝试使用nostra13/ImageLoader(https://github.com/nostra13/Android-Universal-Image-Loader)在一项活动中,用户可以从媒体库中选择图像或使用相机拍摄新图像。当这个动作完成后,我有了一个完整的图片路径,格式为“/mnt/sdcard/DCIM/100ANDRO/whatever.jpg”,也就是说,一个保存在SD卡中的图

  • 从JS开始不是我的优势之一。在过去的几天里,我一直在尝试编辑这个JS函数,使其强制下载bas64图像。当点击下载按钮时,该函数的作用是打开一个带有图像的新窗口。然后用户必须右键单击并保存图片。我试图强制下载图像,而不是右键单击并另存为。 dataurl生成base4 png字符串(数据:image/jpeg;base64,/9j/4aaqskzjrgabaaqabaad/2wbdaaaebaqeb

  • 我正在尝试加强我对asyncTask的了解,所以我按照教程下载了一个图像,但我不明白,我得到了一个错误的ArrayOutofBound索引,所以如果有人告诉我原因这里是代码,请告诉我为什么他迭代进度条最大 下面是堆栈跟踪01-20 03:37:40.607 407 5-4096/com.gamecodeschool.bodybuilder E/AndroidRuntime:致命异常:AsyncTa

  • 我尝试在桌面应用程序中加载图像,但我不知道图像的路径 错误: 线程“AWT-EventQueue-0”java.lang.NullPointerException在javax.swing.ImageIcon处出现异常。(未知源)在Ventanas.Success处。(success.java:30)

  • 从用户处获取文件(使用“dropzone”拖放引导模块接收文件) 修改并对文件进行一些“工作” 将文件压缩到一起,以便下载单个文件 将下载内容发送回用户进行下载(自动或通过链接,详情如下) 上面的粗线是不起作用的,我正在努力弄清楚。以下是相关的超文本标记语言和javascript的文章: 用户单击"转换上传文件"按钮,然后将href更新到生成的zipfile位置,然后能够通过单击"下载文件"超文本