网页下载下来使用,在日常工作中使用频率还是很高的,有时候确实能解一时之急,我自己就有很窘迫的经历。
我开会的时候,都会把准备好的文档存在局域网,到会议室直接打开就能直接用了。有一次到分公司,由于分公司刚刚成立,内网还没有和母公司连通。结果这下子懵逼了,上不去内网,看不到文档。又是叫同事发过来,又是提发送文件的安全申请,让人着急。
如果把网站保存下来,放在自己的电脑中,既不用担心信息泄露问题,又不用为了看不了文档而着急。
遇到问题,记录下来,然后解决问题,程序员的解决思路永远是自己创造轮子的,接下来就是不断的探索解决方案。
其实下载网页的方式有很多种,其中有几种办法使用的比较多,例如:如果你用Chrome,直接按 Ctrl+s 就可实现。使用这种方法,Chrome会把整个网站,按照编译完成的源码目录结构保存下来。像下面这样:
下载完成的文件直接点击 xxx.html 可以直接离线访问,但是这种方式对目录的依赖结构比较高,怎么理解呢?就是 html 文件和对应文件名的文件夹必须在同一个目录中,才能正常使用。拷贝到其他机器的时候必须要两个同时拷贝才可以,否则就会排版错乱。
如果有十个或者更多的网页需要拷贝或者删除,就会很麻烦,例如我想在其中找到其中几个,复制到其他地方,很容易弄错顺序。
HTML 是一种纯文本格式,它用于排版文字。纯文本文档的意思就是,文档中只包含文字内容,不包含二进制内容,举个例子:打印出的A4纸,只有文字没有图片。而 HTML 想要显示照片等二进制信息,通常都会链接到其他文件,也就是上面文件夹里面的内容。
不过 Chrome 下载文件这种方式也有优点,下载下来的文件可以保持独立性,比如说,我需要这个网页中的一张图片,那么就可以直接到文件夹里面寻找了。
另外还有一种办法,也有很多人再使用。Chrome 在打印网页的时候,会把网页转成 PDF ,然后在进行打印。那么就给我们提供了很明确的思路,把网页直接保存为 PDF ,这样保存下来的网页就只有一个文件。
使用Chrome,直接按下Ctrl+p就可以。然后目标打印机选择 另存为 PDF 。
这个功能很多浏览器都支持
但是这种办法也有很明显的缺点,由于 PDF 是静态文档,网页上的一些动画可能不会正常显示,而且排版也有可能会错乱,这完全靠运气。个人觉得这不是一种很靠谱的方法。
这时候主角来了!有一个工具既可以把网页保存为 html 又可以保持是单文件。他就是 monolith ,你可以在 github 上面找到它,但是源码并没有编译为可执行文件,我把它编译了一下,下面会放上来链接,https://github.com/leconio/Repos/raw/master/monolith.7z。
那么下面就简单说说使用方法:如果你下载我的链接,那么里面有三个文件:
第一个是Mac平台编译出来的,使用方式为:
./monolith 网站地址 > xxx.html
默认情况下 monolith 会把生成的 html 输出到标准输出流,也就是当前终端。使用 > 我们把输出的内容重定向并覆盖到文件。
执行完成之后,在这个目录下面就会有一个对应的文件:xxx.html 。
另外两个是 Windows 平台使用的。为了简化使用,我写了一个 CMD 脚本。直接点击 monolith.cmd ,然后粘贴地址就可以完成下载。
下载完成之后,在本地你会发现只有一个 html 文件。我们打开之后,发现图片和JS等信息都在,而且排版正常。那么就要思考了,我们之前说过,HTML 是放置纯文本信息的,那么图片在哪里呢?
答案显而易见,就在 HTML 文件里面。为了方便小图片传输,有一种叫 Base64 的东西,它可以把二进制信息变成成纯文本。这在使用 Json 传递数据的今天十分常见,它可以减少一次请求(题外话),这里就是用的这个原理。monolith 把图片等二进制内容转为了纯文本,保存在 HTML 文件中。我们在下载的文件源码可以看到:
对比源代码,src 信息已经变成了 base64 格式的图片,就是那串乱码。复制那串乱码,从网上搜一个 base64 转图片工具,粘贴进去,这时会发现就是我们看到的那张图片。这样一来,无论这个网站上有多少个文件,都会保存到一个 HTML 文件里面,而且还能离线使用。
当然,base64 编码的图片比原生图片略大,这可能也是你现在在担心的问题。不过 monolith 会特殊处理文件体积。我们可以看看 Chrome 直接下载和使用 monolith 下载体积相差多少。我们把两种方式下载的网页都进行了 7-Zip 压缩。
我们可以看到,使用 monolith 下载会比 Chrome 直接下载小一倍还多!
最后要说的是局限性,无论那种方法,都几乎不能把视频网站中的视频下载下来。因为现在的视频地址都是 Token 加密的,同理,使用 Token 加密的其他请求信息也无法下载。
比如你可以试试下载其他网站的首页,Logo 和视频都是下载不了的。但是也有解决办法,那就是另外一个领域的事情了,以后有机会说给大家听。
如果这篇文章对您或者您的朋友有帮助,感谢您关注,转发。
SP.NET Core 支持直接向客户端提供静态文件,比如:Html文件,图片,js文件,为了能够让 ASP.NET Core 处理静态文件,需要使用 静态文件中间件
并做一些必要配置就可以了,这篇文章我们就来一起讨论下。
要想安装 静态文件中间件,必须将 Microsoft.AspNetCore.StaticFiles
添加到 ASP.NET Core 的请求管道中,可以使用 Visual Studio 2019 中的 NuGet package manager
可视化界面,要么用 NuGet package manager console
在命令行窗口中键入如下命令。
dotnet add package Microsoft.AspNetCore.Rewrite
下面的代码展示了在 Startup 中如何对 静态文件中间件 进行配置。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStaticFiles();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
}
静态文件都是统一配置在 wwwroot
文件夹下, 可以看到 wwwroot
文件夹下还有 css
,images
,js
等文件夹,值得注意的是这些文件夹之间可以采用相对路径进行访问。
如果 静态文件中间件
已经成功配置好,接下来可以使用下面的路径访问 test.png
图片。
http://localhost:44399/images/test.png
如果大家心思细腻的话就会发现,当我不想用 wwwroot
来承载这些静态文件的话,该怎么做呢? 换句话说,我怎么去处理在 wwwroot
文件夹之外的静态文件呢? 下面的代码片段展示了如何去配置。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(),@"IDGStaticFiles")),
RequestPath = new PathString("/StaticFiles")
});
}
一般web程序中都会提供一个叫做 目录浏览
的功能,它允许用户浏览一个指定文件夹下的所有文件和文件夹,但通常为了安全考虑,这个功能默认都是关闭状态,如果你有开启的需求,可以使用 UseDirectoryBrowser
扩展方法在 Configure 下进行配置,下面的代码片段展示了如何开启 目录浏览
。
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDirectoryBrowser();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot")),
RequestPath = new PathString("/IDGImages")
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\images")),
RequestPath = new PathString("/IDGImages")
});
}
}
然后把程序跑起来并在 url 中指定 IDGImages
路径,你将会看到 wwwroot\images
文件夹下的所有内容。
从前面的例子中可以看到,wwwroot 中的这些文件都是公开可访问的,但很多时候想在某些文件上做一些授权处理,如果要这么做的话,有两种方式可以实现。
将需要保护的文件从 wwwroot 移到单独的文件夹中。
利用 Action 来处理文件,并返回 FileResult 的方式。
最后,你可以利用 UseDefaultFiles
扩展方法来提供一个 web程序的 默认页面,下面的代码配置展示了如何配置。
public void Configure(IApplicationBuilder app)
{
app.UseDefaultFiles();
app.UseStaticFiles();
}
值得注意的是,如果你的web程序中需要有 静态文件
,默认文件
,目录浏览
三项功能的话,可以直接使用 UseFileServer
扩展方法,下面的代码片段展示了如何在 Configure 方法中进行配置。
app.UseFileServer(enableDirectoryBrowsing: true);
译文链接:https://www.infoworld.com/article/3446957/how-to-work-with-static-files-in-aspnet-core.html
Umi3官方文档中,有一个配置项exportStatic需在配置文件(umirc.ts或config/config.ts)中设置,语法如下:
exportStatic
Type: object
此配置项有三个参数,规范如下:
1. htmlSuffix:启用.html 后缀。
2. dynamicRoot:部署到任意路径。
3. extraRoutePaths:生成额外的路径页面,用法和场景见预渲染动态路由
Umi框架配置 html 的输出形式,默认只输出 index.html。如果需要预渲染,请开启 ssr 配置,常用来解决没有服务端情况下,页面的 SEO 和首屏渲染提速。如果开启 exportStatic,则会针对每个路由输出 html 文件。
举个例子,路由配置如下:
/
/users
/list
在不开启 exportStatic 时,输出:
- index.html
设置 exportStatic: {} 后,输出:
- index.html
- users/index.html
- list/index.html
设置 exportStatic: { htmlSuffix: true } 后,输出:
- index.html
- users.html
- list.html
若有 SEO的话需求,可开启 ssr 配置,在 umi build 后,会路由(除静态路由外)渲染成有具体内容的静态 html 页面,例如在配置文件(umirc.ts | config/config.ts)中有如下路由配置:
{
routes: [
{
path: '/',
component: '@/layouts/Layout',
routes: [
{ path: '/', component: '@/pages/Index' },
{ path: '/bar', component: '@/pages/Bar' },
{ path: '/news', component: '@/pages/News' },
{ path: '/news/:id', component: '@/pages/NewsDetail' },
],
},
];
}
设置 { ssr: {}, exportStatic: { } 后,且在编译后,生成如下产物:
- dist
- umi.js
- umi.css
- index.html
- bar
- index.html
- news
- index.html
- [id].html
考虑到预渲染后,大部分不会再用到 umi.server.js 服务端文件,构建完成后会删掉 umi.server.js 文件如果有调试、不删除 server 文件需求,可通过环境变量 RM_SERVER_FILE=none 来保留。
转载:码书网「链接」
*请认真填写需求信息,我们会在24小时内与您取得联系。