关于如何显示Jianshu图片的方案
问题的提出
简书是一个很好的博客网站,很多朋友都在jianshu上进行创作。当然出于各种目的,我们可能想将简书的文章同步到其他网站。
这个时候你会发现所有的文章里面的图片都无法正常显示了。
原因
如果你观察过简书投稿的过程,你会发现,简书投稿的时候,所有的图片,简书都会重新保存一遍。也就是说,即使你的图片使用的是一个链接,简书系统也会将这个图片抓取然后保存到自己的服务器。
简书的图片地址大概是这个样子的:
//upload-images.jianshu.io/upload_images/2005483-a02a512bf1520d08.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240
然后如果你在自己的网站上使用这样的图片路径,则会返回403
//upload-images.jianshu.io/upload_images/1628444-05ac5dac52e7ca93.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 Failed to load resource: the server responded with a status of 403 (Forbidden)
原因是应为,浏览器在获取图片资源的时候,会将添加一个 Referer 在HTTP Head。服务器会检查这个参数是不是简书的域。
如果不是的话,就403禁止了。所以你的网站用了这个地址,就无法正确显示这个图片了。
解决方案
如果你将这个图片地址在浏览器中直接打开,你会发现图片是可以显示的。
这个时候Head是没有Referer信息的。也就是说服务器没有禁止掉空Referer的访问。
一般来说,修改Referer是很困难的事情,特别是使用前端的方法。所以这里使用的是偏后端的方法。
- 如果前端程序发现了jianshu的图片,则将图片的URL进行变化。例如这里将简书的URL修改成 “/FileSystem/Jianshu?filename=xxxx”的形式。
- 在后台的代码中,使用WebClient下载图片。
if (this.src.indexOf(jianshuUrl) == -1){
//非简书
filepath = this.src;
}else{
//简书
if (this.src.indexOf("?") != -1){
filepath = this.src.substring(0,this.src.indexOf("?"));
}else{
filepath = this.src;
}
filepath = filepath.substring(jianshuUrl.length);
filepath = "/FileSystem/Jianshu?filename=" + filepath;
this.src = filepath;
}
/// <summary>
/// Jianshu
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public ActionResult Jianshu(string filename) {
string filepath = JianshuFolder + filename;
if (!System.IO.File.Exists(filepath))
{
try
{
//下载简书文件
WebClient client = new WebClient();
client.DownloadFile("//upload-images.jianshu.io/upload_images/" + filename, filepath);
}
catch (System.Exception ex)
{
InfraStructure.Log.ExceptionLog.Log("SYSTEM", "Jianshu", "FileSystem", ex.ToString());
return null;
}
}
return File(filepath, "image/jpeg");
}
也就是说,简书的图片,不是由浏览器去取得的,而是后台程序去下载的。图片的url地址已经发生变化了。
潜在问题
1.简书可能会禁止无Referer的资源下载请求
2.如果该图片没有被写作者访问过,可能在使用本网站编辑器的时候,图片预览的地方也无法正常显示。
3.对于网站服务器要求比较高。
文本已经同步到http://www.codesnippet.info/Article/Index?ArticleId=00000036
关于如何显示Jianshu图片的方案的更多相关文章
- Android RecyclerView使用 及 滑动时加载图片优化方案
1.控制线程数量 + 数据分页加载2.重写onScrollStateChanged方法 这个我们后面再谈,下面先来看看RecyclerView控件的使用及我们为什么选择使用它 RecyclerView ...
- MFC对话框显示BMP图片
1.MFC对话框显示BMP图片我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) ...
- Jquery判断页面图片是否加载失败,加载失败则显示默认图片
例子: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...
- 第三方网站不能调用微信公众平台里的图片了 显示"此图片来自微信公众号平台未经允许不可引用"
下午ytkah在自己小博客搜索时看到有几篇文章图片显示不了,再访问一些网站时发现有些图片无法显示出来,显示"此图片来自微信公众号平台未经允许不可引用",如下图所示,这个应该是最近微 ...
- mfc显示静态图片最简单的方法
一致都是研究如何调用opencv显示动态图片,但是很多时候在显示图标的时候,都是需要显示静态图片,现在将最简单的方法总结下: 1.添加picture控件 2.添加资源,要求为bmp 3.修改属性 结果 ...
- Android ImageView显示本地图片
Android ImageView 显示本地图片 布局文件 <?xml version="1.0" encoding="utf-8"?> <R ...
- MVC显示Base64图片
本篇演示ASP.NET MVC应用程序,显示Base64图片. Insus.NET浏览网页,发现一个站点http://www.base64-image.de/ 想起以前也有实现过<如何把数据流转 ...
- 【ASP.NET 进阶】获取MP3文件信息并显示专辑图片
突发奇想,想弄个显示MP3文件信息和专辑图片的小Demo,个人不是大牛,遂百度之,总算搞定,现分享如下. 效果图: GIF效果图: 主要是依靠2个DLL文件:ID3.dll 和 Interop.She ...
- Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果
版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/1873 ...
随机推荐
- Javascript基础回顾 之(一) 类型
本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...
- JavaScript学习笔记之Object
对象(object)是JavaScript的核心概念,也是最重要的数据类型.JavaScript的所有数据都可以被视为对象. 简单说,所谓对象,就是一种无序的数据集合,由若干个“键值对”(key-va ...
- Xcode升级 Alcatraz 无法使用
Alcatraz 主要是可以管理xcode 插件 随着 Xcode 的更新 Alcatraz 有可能无法使用 以下是解决办法: 1,关闭Xcode 2,如果已经安装过 Alcatraz,先卸载掉,然后 ...
- 操作数据库mysql
显示表结构 desc 表 显示数据库信息 show create database 数据库名 show create table 表名
- 过年7天乐,学nodejs 也快乐
自从上次接触nodejs 已经好长时间了,但是年底公司太忙了 ,没时间看, 上次文章在ubuntu上安装nodejs[开启实时web时代] http://www.cnblogs.com/qqlovin ...
- Sql Server系列:索引基础
1 索引概念 索引用于快速查找在某个列中某个特定值的行,不使用索引,数据库必须从第1条记录开始读完整个表,知道找出需要的行.表越大,查询数据所花费的时间越多.如果表中查询的列有索引,数据库能快速到达一 ...
- jQuery源码分析系列(36) : Ajax - 类型转化器
什么是类型转化器? jQuery支持不同格式的数据返回形式,比如dataType为 xml, json,jsonp,script, or html 但是浏览器的XMLHttpRequest对象对数据的 ...
- Iterate Files by Tcltk
Iterate Files by Tcltk eryar@163.com Abstract. Tcl/Tk provide a programming system for developing an ...
- SmtpClient发邮件时为什么用MailMessage.From而不用MailMessage.Sender
今天在看C#高级编程(第9版)的时候,在768页看到这样的一段代码 SmtpClient sc = new SmtpClient(); sc.Host = "邮箱服务器地址"; M ...
- Vue.js学习笔记(8)拖放
小颖在目前负责的项目中,负责给同事提供所需组件,在这期间,我们家大颖姐姐让我 写个拖拽组件,一开始我是用click实现,先将你要拖拽的dom点一下,然后再点你要放的位置,这个dom再通过小颖写的方法, ...