none
Link в соц. сетях RRS feed

  • Вопрос

  • В соц. сетях есть такая вещь, пишешь URL сайта и каким то образом появляется картинки с этого сайта, в общем Вы это знаете.

    Так вот, мне интересует как это работает и как делать что с моего сайта чтобы он взял первый очередь ту картинку которая по теме а не фото пользователя.

    Я знаю что в этих сайтах предоставляют возможность выбора, но этого нет когда вставишь в комментах(например facebook)

    спасибо и извините за примитив

Ответы

  • Значит делаем так. В Global.asax пишем код

    public static void RegisterRoutes(RouteCollection routes)
        {
          //Идёт первым, чтобы не попала в IgnoreRoute
          routes.Add("ImagesRoute", new Route("myImages/{filename}", new ImageRouteHandler()));
          routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
          routes.MapRoute(
              "Default", // Route name
              "{controller}/{action}/{id}", // URL with parameters
              new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
          );
        }

    Создаём обработчик нашего роута

    public class ImageRouteHandler : IRouteHandler
      {
        private string denyDomain = "myDomainName";
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
          string filename = requestContext.RouteData.Values["filename"] as string;
    
          //Или более гибкий подход на основе регулярных выражений
          if(requestContext.HttpContext.Request.Url.ToString().Contains(denyDomain))
          {
            return null;
          }
          else
          {
            requestContext.HttpContext.Response.Clear();
            requestContext.HttpContext.Response.ContentType = GetContentType(requestContext.HttpContext.Request.Url.ToString()); 
            string filepath = requestContext.HttpContext.Server.MapPath("~/Content/MyImages/" + filename );
            requestContext.HttpContext.Response.WriteFile(filepath);
            requestContext.HttpContext.Response.End();
    
          }
          return null;
        }
    
        private static string GetContentType(String path)
        {
          switch (Path.GetExtension(path))
          {
            case ".bmp": return "Image/bmp";
            case ".gif": return "Image/gif";
            case ".jpg": return "Image/jpeg";
            case ".png": return "Image/png";
            default: break;
          }
          return "";
        }
      }
    }

    И папку с изображениями которые не нужно передавать определённому домену. Например ~/Content/MyImages. Закрываем доступ к нему всем добавив туда файл Web.Config  с содержимым

    <?xml version="1.0"?>
    <configuration>
        <system.web>
          <authorization>
            <deny users="?" />
          </authorization>
        </system.web>
    </configuration>

    но доступ остаётся через маршрутизацию, с фильтрацией доменов. И всё, а вот проект.


    • Помечено в качестве ответа DavidJag 21 мая 2012 г. 14:06
    • Изменено YatajgaModerator 3 ноября 2012 г. 19:05 Обновил ссылку
    Модератор

Все ответы

  • Если можно по подробней и понятней, а то пока не очень понятно.
    Модератор
  • Дело в том что в социальных сайтах есть поля куда вставишь линк на другие сайты, так вот когда я вставляю линк на мой сайт на конкретный пост в социальных сайтах появляется фото пользователя моего сайта кто этот пост создал.

    вопрос что менять в моем сайте чтоб брал картину поста или хотя бы не брал фото пользователей моего сайта

  • Ясно, понял. А на чём написан Ваш сайт?
    Модератор
  • Ну тогда дело обстоит ещё проще. Используя систему роутинга, Вы можете закрыть доступ к вашим картинкам, для определённых доменов или наоборот, выдавать их по чётко указанным ссылкам.
    Модератор
  • мне нужен чтоб фото пользователей не взял а остальные взял 

    а каким образом, если можно примерчик на C#

  • Значит делаем так. В Global.asax пишем код

    public static void RegisterRoutes(RouteCollection routes)
        {
          //Идёт первым, чтобы не попала в IgnoreRoute
          routes.Add("ImagesRoute", new Route("myImages/{filename}", new ImageRouteHandler()));
          routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
          routes.MapRoute(
              "Default", // Route name
              "{controller}/{action}/{id}", // URL with parameters
              new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
          );
        }

    Создаём обработчик нашего роута

    public class ImageRouteHandler : IRouteHandler
      {
        private string denyDomain = "myDomainName";
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
          string filename = requestContext.RouteData.Values["filename"] as string;
    
          //Или более гибкий подход на основе регулярных выражений
          if(requestContext.HttpContext.Request.Url.ToString().Contains(denyDomain))
          {
            return null;
          }
          else
          {
            requestContext.HttpContext.Response.Clear();
            requestContext.HttpContext.Response.ContentType = GetContentType(requestContext.HttpContext.Request.Url.ToString()); 
            string filepath = requestContext.HttpContext.Server.MapPath("~/Content/MyImages/" + filename );
            requestContext.HttpContext.Response.WriteFile(filepath);
            requestContext.HttpContext.Response.End();
    
          }
          return null;
        }
    
        private static string GetContentType(String path)
        {
          switch (Path.GetExtension(path))
          {
            case ".bmp": return "Image/bmp";
            case ".gif": return "Image/gif";
            case ".jpg": return "Image/jpeg";
            case ".png": return "Image/png";
            default: break;
          }
          return "";
        }
      }
    }

    И папку с изображениями которые не нужно передавать определённому домену. Например ~/Content/MyImages. Закрываем доступ к нему всем добавив туда файл Web.Config  с содержимым

    <?xml version="1.0"?>
    <configuration>
        <system.web>
          <authorization>
            <deny users="?" />
          </authorization>
        </system.web>
    </configuration>

    но доступ остаётся через маршрутизацию, с фильтрацией доменов. И всё, а вот проект.


    • Помечено в качестве ответа DavidJag 21 мая 2012 г. 14:06
    • Изменено YatajgaModerator 3 ноября 2012 г. 19:05 Обновил ссылку
    Модератор
  • огромное спасибо я попробую если что напишу thanks