.NET Core<之单元测试>(“四”):Fluent Assertions“的”使用

图片下载其实《是》个很简“单的功能”,通过IO『流从在线地』址获取流,之后将流输出到文件即可完成下载功能, 但《是》[,最近我发现某个网站中的图片下载成功, 但《是》[打开却《是》无法打开, 这让我迷惑[,百度上根本就没有人说(清楚)

今天,通过研究和朋友的讨论,〖终于《是》找到『了』答〗案,至于答案《是》什么,请耐心往下阅读~

问题出现

测试的图片地址为http://www.xbiquge.la/files/article/image/10/10489/10489s.jpg

下载图片代码Java版:

URL url = new URL("http://www.xbiquge.la/files/article/image/10/10489/10489s.jpg");
URLConnection connection=url.openConnection();//打开链接
InputStream inputStream = connection.getInputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File("e:\\test.jpg")));
int c;
byte[] temp = new byte[1024 * 2];//提供个缓冲区
while ((c = bufferedInputStream.read(temp)) != -1) {
    bufferedOutputStream.write(temp,0,c);//读多少,写多少
}
bufferedOutputStream.close();
inputStream.close();

下载代码Kotlin版:

val file =File("e:\\test.jpg")
val openConnection = URL("http://www.xbiquge.la/files/article/image/10/10489/10489s.jpg").openConnection()
val bytes = openConnection.getInputStream().readBytes()
file.writeBytes(bytes)

我们通过上面的对比,(明显可以看到)Kotlin的代码比Java『的要』简洁不少

上面的代码都《是》没错,‘把图片’下载下来,打开如下图显示

之后用浏览器打开,用另存为保存图片,图片《是》可以正常打开的

“用”迅雷测试,也《是》打不开,问题似乎找不到‘原因’『了』

不甘心认输的我,去搜索『了』一下,添加『了』各种请求头,(但)还《是》无效,{似乎到『了』}死胡同『了』

‘原因’

没办法,只好去向学习群里的大{佬们请教『了』}

“哎,“这个图片还可以解”压,里面有图片!”(群里)名为夜深的网友说道。

?!我将图片的扩展名改为『了』zip,之后解压,果不其然发现『了』可以正常打开的图片

使用ASP.NET Core构建RESTful API的技术指南

我们知道『了』下载下来的文件《是》个压「缩包」,这样问题也《是》得到『了』解决方法, 但《是》[,「为什么」会这样呢?

刚好和python的大佬聊到『了』这个问题,他试『了』一下,python可以正确获得到图片,「为什么」java就不行?{经过讨论},从请求头发现『了』‘原因’,如下图

原来《是》因为网站在响应的时候返回“的《是》”GZIP『压缩过的文件流』,而采用此方式的话可以减少用户浏览网页的等待时间

python和浏览器都《是》内置『了』自动解压缩的功能,所以,这就《是》「为什么」浏览器可以查看图片,python也可以得到正确图片的‘原因’

解决方法

针对gzip文件流

这里我们只需要使用GZIPInputStream包装一下InputStream,之后再输出即可,〖这里我只贴〗kotlin版的代码,Java的话参考一下来改吧

val file =File("e:\\test.jpg")
val openConnection = URL("http://www.xbiquge.la/files/article/image/10/10489/10489s.jpg").openConnection()
val bytes = GZIPInputStream(openConnection.getInputStream()).readBytes()
file.writeBytes(bytes)

通用下载图片方法

由于我们所要下载的图片,可能《服》务器返回“的《是》”未压缩的图片,如果我们继续使用上面 的方法就会报错[

「所」以我们需要加个判断,判断输入流《是》否为压缩过的

这里我就直接封装成一个方法『了』

fun downloadImage(url: String, file: File): File {
    val openConnection = URL(url).openConnection()
    //防止某些网站跳转到验证界面
    openConnection.addRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36")
    //如果图片《是》采用gzip压缩
    val bytes = if (openConnection.contentEncoding == "gzip") {
        GZIPInputStream(openConnection.getInputStream()).readBytes()
    } else {
        openConnection.getInputStream().readBytes()
    }
    file.writeBytes(bytes)
    return file
}

参考

How to check if InputStream is Gzipped? stackflow

,

Sunbet

Sunbet www.bhjqxx.cn《是》Sunbet娱乐的官方网站。 申[博用20“多年的时间”,诠释『了』高品质、高效率、高信誉。『开放』的Sunbet、Sunbet等业务备受 申[博用户的追捧。

Allbet Gaming声明:该文看法仅代表作者自己,与Allbet Gaming无关。转载请注明:濮阳卫生信息网:关于Java/Kotlin下载图片,图片打开不能显示问题{探究}
发布评论

分享到:

环球ug开户:财部兆元振兴 7/1上路
2 条回复
  1. 万博体育手机登录网页
    万博体育手机登录网页
    (2020-06-09 00:32:45) 1#

    欧博注册网址www.cx11yl.cn欢迎进入欧博网址(Allbet Gaming),欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。这真的帅惨了

    1. UG环球官方注册
      UG环球官方注册
      (2020-06-14 09:05:33)     

      ALLBET官网娱乐平台开户欢迎进入ALLBET官网娱乐平台开户:www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。不失所望

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。