问题的提出

简书是一个很好的博客网站,很多朋友都在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是很困难的事情,特别是使用前端的方法。所以这里使用的是偏后端的方法。

  1. 如果前端程序发现了jianshu的图片,则将图片的URL进行变化。例如这里将简书的URL修改成 “/FileSystem/Jianshu?filename=xxxx”的形式。
  2. 在后台的代码中,使用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图片的方案的更多相关文章

  1. Android RecyclerView使用 及 滑动时加载图片优化方案

    1.控制线程数量 + 数据分页加载2.重写onScrollStateChanged方法 这个我们后面再谈,下面先来看看RecyclerView控件的使用及我们为什么选择使用它 RecyclerView ...

  2. MFC对话框显示BMP图片

    1.MFC对话框显示BMP图片我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) ...

  3. Jquery判断页面图片是否加载失败,加载失败则显示默认图片

    例子: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...

  4. 第三方网站不能调用微信公众平台里的图片了 显示"此图片来自微信公众号平台未经允许不可引用"

    下午ytkah在自己小博客搜索时看到有几篇文章图片显示不了,再访问一些网站时发现有些图片无法显示出来,显示"此图片来自微信公众号平台未经允许不可引用",如下图所示,这个应该是最近微 ...

  5. mfc显示静态图片最简单的方法

    一致都是研究如何调用opencv显示动态图片,但是很多时候在显示图标的时候,都是需要显示静态图片,现在将最简单的方法总结下: 1.添加picture控件 2.添加资源,要求为bmp 3.修改属性 结果 ...

  6. Android ImageView显示本地图片

    Android ImageView 显示本地图片 布局文件 <?xml version="1.0" encoding="utf-8"?> <R ...

  7. MVC显示Base64图片

    本篇演示ASP.NET MVC应用程序,显示Base64图片. Insus.NET浏览网页,发现一个站点http://www.base64-image.de/ 想起以前也有实现过<如何把数据流转 ...

  8. 【ASP.NET 进阶】获取MP3文件信息并显示专辑图片

    突发奇想,想弄个显示MP3文件信息和专辑图片的小Demo,个人不是大牛,遂百度之,总算搞定,现分享如下. 效果图: GIF效果图: 主要是依靠2个DLL文件:ID3.dll 和 Interop.She ...

  9. Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/1873 ...

随机推荐

  1. Android 知识杂记(MVP模式)

    MVP的模式在于将原来activity中业务逻辑的部分剥离出来,代码示例如下: Account public class Account { private String mUsername; pri ...

  2. 剑指Offer面试题:24.复杂链表的复制

    一.题目:复杂链表的复制 题目:请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表.在复杂链表中,每个结点除了有一个Next指针指向下一 ...

  3. C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图

    C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图 +BIT祝威+悄悄在此留下版了个权的信息说: 最近需要用OpenGL绘制文字,这是个很费时费力的事.一般的思路就是 ...

  4. Mint linux 自定义上下文菜单实现ZIP压缩文件无乱码解压

    1. 前提条件 我的Mint Linux 是Thunar文件管理器(默认的). 2. 配置自定义动作 打开Thunar文件管理器,点击菜单“编辑”=>“配置自定义动作”.点击“+”添加一个新的. ...

  5. Qt And MFC Mouse Over Tips

    Qt鼠标提示分析说明 关于鼠标停留在控件上面,显示提示内容的方法. 对于Qt来说, Qt的某一个控件类, 如果属于GUI的, 那么这个控件类会有一个setToolTip(QString text)的方 ...

  6. 记一个简单的保护if 的sh脚本

    真是坑爹,就下面的sh,竟然也写了很久! if [ `pwd` != '/usr/xx/bin/tomcat' ] then echo "rstall is not allowed in c ...

  7. C#设计模式-装饰者模式

    在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).Access ...

  8. CentOS7安装mysql提示“No package mysql-server available.”

    针对centos7安装mysql,提示"No package mysql-server available."错误,解决方法如下: Centos 7 comes with Mari ...

  9. SqlServer索引的原理与应用

    索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录 ...

  10. easyui中方向键、tab键、回车键

    1.html中 function changeTab(event, i) { var keyCode = event.keyCode; var inputs = jQuery("#table ...