• 自动从第三方下载资源到本地


    有个同事从别人服务器捞了一份源代码下来,这个网站的主要是一些图片和flash动画资源文件,值钱的东西也是这些,权限控制啥的基本形同虚设。

    但是图片和动画文件太多,没办法一个一个去网页上看地址一个一个下载,所以呢我们就需要把别人服务器文件按照目录结构自动下载到我们自己的服务器。

    这里.net里面只需要截取请求地址,解析地址中相对路径,自动从第三方下载到本地对应路径就行了。

    这里列出一个HttpModule的范例。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Text.RegularExpressions;
    using System.IO;
    using System.Net;
    
    namespace HttpDownload
    {
        public class DownloadModule : IHttpModule
        {
            public void Dispose()
            {
                throw new NotImplementedException();
            }
    
            public void Init(HttpApplication context)
            {
                context.BeginRequest += new EventHandler(context_BeginRequest);
            }
    
            /// <summary>
            /// Request监听事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void context_BeginRequest(object sender, EventArgs e)
            {
                HttpApplication httpApp = (HttpApplication)sender;
                // 获取请求的完整的地址
                var url = httpApp.Request.RawUrl;
                // 正则表达式截取{.字母结尾}的请求
                // 此处只是简单的地址判断,可以根据自己的要求修改这部分的正则表达式
                var regex = new Regex("[^/]*[.]{1}[a-zA-Z]*$");
                // 判断是否满足条件
                if (regex.IsMatch(url))
                {
                    // 获取相对路径地址
                    string path = httpApp.Request.Url.AbsolutePath;
                    // 开始下载文件
                    DownloadFile("www.domain.com", path);
                }
    
            }
    
            /// <summary>
            /// 从服务器下载文件
            /// </summary>
            /// <param name="domain"></param>
            /// <param name="absolutePath"></param>
            void DownloadFile(string domain, string absolutePath)
            {
                // 按照相对路径获取本地文件路径
                string localPath = HttpContext.Current.Server.MapPath(absolutePath);
                // 判断文件是否存在,已经存在的文件不重复下载
                if (!File.Exists(localPath))
                {
                    // 文件夹不存在自动创建文件夹
                    string directory = Path.GetDirectoryName(localPath);
                    if (!Directory.Exists(directory))
                    {
                        Directory.CreateDirectory(directory);
                    }
    
                    // 相对路径拼接第三方文件的地址,下载文件
                    var request = HttpWebRequest.Create($"http://{domain}{absolutePath}");
                    var response = request.GetResponse();
                    int bytesProcessed = 0;
                    Stream stream = response.GetResponseStream();
                    FileStream fs = File.Create(localPath);
    
                    byte[] buffer = new byte[1024];
                    int bytesRead;
    
                    do
                    {
                        bytesRead = stream.Read(buffer, 0, buffer.Length);
                        fs.Write(buffer, 0, bytesRead);
                        bytesProcessed += bytesRead;
                    } while (bytesRead > 0);
    
    
    
                    fs.Flush();
                    fs.Close();
                    response.Close();
    
                }
            }
        }
    }

    修改Web.config,添加HttpModule

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.6.1" />
        <httpRuntime targetFramework="4.6.1" />
        <!-- IIS7.0经典模式或者IIS之前版本 -->
        <!--<httpModules>
          <add name="downloadModule" type="HttpDownload.DownloadModule,HttpDownload"/>
        </httpModules>-->
      </system.web>
      <!-- IIS7.0集成模式下 -->
      <system.webServer>
        <modules>
          <add name="downloadModule" type="HttpDownload.DownloadModule,HttpDownload"/>
        </modules>
      </system.webServer>
    </configuration>

    这里的Web.config在不同版本的IIS版本模式下配置可能会有不同,配置的时候注意自己的环境。

  • 相关阅读:
    蝶恋花
    JVM解毒——JVM与Java体系结构
    超赞!IDEA 最新版本,支持免打扰和轻量模式!
    SpringBoot 结合 Spring Cache 操作 Redis 实现数据缓存
    神奇的 SQL 之 WHERE 条件的提取与应用
    终于放弃了单调的swagger-ui了,选择了这款神器—knife4j
    Git 高级用法,喜欢就拿去用
    既然有 HTTP 请求,为什么还要用 RPC 调用?
    SpringBoot和Spring到底有没有本质的不同?
    一条简单的更新语句,MySQL是如何加锁的?
  • 原文地址:https://www.cnblogs.com/stealth7/p/8418705.html
Copyright © 2020-2023  润新知