关于如何显示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 ...
随机推荐
- ABP理论学习之模块系统
返回总目录 本篇目录 模块介绍 生命周期事件 模块依赖 自定义模块方法 模块介绍 ABP提供了构建模块并将这些模块组合起来创建应用的基础设施.一个模块可以依赖另一个模块.一般来说,一个程序集可以认为是 ...
- ASP.NET Core 1.0中的管道-中间件模式
ASP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middleware)的方式注册在管道中.显而易见这样的设计非常松耦合 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- MySQL5.7 新增配置
1.log_timestamps 在5.7.2以后的版本中增加一个单独控制error log , general log,slow log的记录的时间,默认是UTC,需要配置成SYSTEM(本地时间) ...
- AngularJs之二
今天先讲一个angularJs的表单绑定实例: <div ng-app="myApp" ng-controller="formCtrl"> < ...
- SQL注入
@org.junit.Test public void testLogin() { CardDAO cd=new CardDAO(); if(cd.dengru("' or 1 = 1--& ...
- Sql Server系列:Select基本语句
1 T-SQL中SELECT语法结构 <SELECT statement> ::= [WITH <common_table_expression> [,...n]] <q ...
- Dnsmasq安装与配置
默认的情况下,我们平时上网用的本地DNS服务器都是使用电信或者联通的,但是这样也导致了不少的问题,首当其冲的就是上网时经常莫名地弹出广告,或者莫名的流量被消耗掉导致网速变慢.其次是部分网站域名不能正常 ...
- Android音频开发之MediaRecorder/MediaPlayer
前言: 上次我们介绍了实时采集音频数据以及播放,今天我们来认识一下直接录制文件的方式. 直接上代码:录制管理类 public class MediaRecorderManager { public s ...
- AngularJS API之$injector ---- 依赖注入
在AngularJS中也有依赖注入的概念,像spring中的依赖注入,但是又有所不同.Spring中使用构造注入或者设值注入的方式,还需要做一些额外的操作,但是angular中只需要在需要的地方声明一 ...