X
تبلیغات
رایتل
موضوعات
نرم افزار (61)
سیستم عامل ویندوز (16)
نرم افزار مالتی مدیا (23)
نرم افزار پخش کننده (11)
نرم افزار مبدل (3)
ویرایشگر صوت و تصویر (9)
نرم افزار انیمیشن (1)
سایر نرم افزار ها (25)
. (47)
نرم افزار اینترنت (57)
نرم افزار مدیریت دانلود (7)
نرم افزار اف تی پی (4)
رم افزار مرورگر وب (17)
نرم افزار مسنجر (11)
ابزار اینترنت (22)
درایو انلاین (1)
نرم افزار کاربردی (68)
نرم افزار فشرده ساز (6)
کتاب الکترونیک (8)
نرم افزار برنامه نویسی (3)
نرم افزار آفیس (4)
نرم افزار مهندسی (2)
نرم افزار بازیابی اطلاعات (8)
نرم افزار فارسی (5)
سخت افزار (18)
نرم افزار دیکشنری (3)
رایت سی دی/دی وی دی (3)
نرم افزار مدیریت دسکتاپ (8)
نرم افزار تبدیل کننده (5)
نرم افزار پشتیبان گیری (2)
نرم افزار بهینه سازی (11)
نرم افزار آموزشی (1)
نرم افزار امنیتی (17)
نرم افزار آنتی ویروس (5)
نرم افزار دیوار آتش (3)
ابزار قفل گذاری و امنیتی (5)
آپدیت و کلید آنتی ویروسها (4)
نرم افزار گرافیک (22)
نرم افزار طراحی (12)
نرم افزار تبدیل کننده (3)
نرم افزار ویرایشگر (7)
ابزار فتوشاپ (5)
سایر (12)
فونت (4)
آیکون (1)
والپیپر (3)
عکس (4)
موبایل (78)
نرم افزار موبایل (9)
جاوا (25)
سونی اریکسون (5)
نوکیا سری ۶۰ (11)
نوکیا سری ۶۰ V3 (10)
آندروید (45)
آیفون (22)
نوکیا سیمبیان سری ^۳ (11)
بازی کامپیوتر (14)
بازی اکشن (6)
بازی ماجرایی (5)
بازی ماشین سواری (1)
بازی فلش (1)
بازی فکری (7)
بازی ورزشی (3)
بازی استراتژیک (5)
بازی کودکان (5)
بازی سیستم عامل لینوکس (1)
بازی سیستم عامل مک (1)
فانتزی (1)
اموزش وترفند (91)
نرم افزار (22)
ویندوز (28)
اینترنت (45)
موبایل (23)
اموزش سخت افزار (11)
فیلم ایرانی (3)
سریال (2)
سینمایی (1)
عکس (9)
تصاویر عاشقانه (1)
جالب وخنده دار (3)
چرا؟ (1)
بازیگر ایرانی (2)
بازیگر خارجی (2)
تصاویر سه بعدی (1)
ایکون (1)
مطالب خاندنی(طنز علمی سیاسی) (20)
وب مستر (8)
اموزشی (1)
ASP.NET (1)
امحصولات فروشگاه

تبلیغات
اخبار
آرشیو مطالب
امار
دوستان
آخرین مطالب ارسالی تورانسل
  درگیر شدن با سایت‌های دیگر که چرا مطالب ما را کپی کرده‌اید نهایتا بجز فرسایش عصبی حاصل دیگری را به همراه ندارد.اساسا زمانیکه مطلبی را به صورت باز در اینترنت انتشار می‌دهید، قید کپی شدن یا نشدن آن‌را باید زد. اما ...می‌توان همین سایت‌ها را تبدیل به تبلیغ کننده‌های رایگان کار خود نمود که در ادامه نحوه انجام آن‌ را در یک برنامه ASP.NET MVC بررسی خواهیم کرد:

 


 

الف) نیاز است ارائه تصاویر تحت کنترل برنامه باشند.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System.IO;
using System.Net.Mime;
using System.Web.Mvc;
  
namespace MvcWatermark.Controllers
{
    public class HomeController : Controller
    {
        const int ADay = 86400;
  
        public ActionResult Index()
        {
            return View();
        }
  
        [OutputCache(VaryByParam = "fileName", Duration = ADay)]
        public ActionResult Image(string fileName)
        {
            fileName = Path.GetFileName(fileName); // تمیز سازی امنیتی است
            var rootPath = Server.MapPath("~/App_Data/Images");
            var path = Path.Combine(rootPath, fileName);
            if (!System.IO.File.Exists(path))
            {
                var notFoundImage = "notFound.png";
                path = Path.Combine(rootPath, notFoundImage);
                return File(path, MediaTypeNames.Image.Gif, notFoundImage);
            }
            return File(path, MediaTypeNames.Image.Gif, fileName);
        }
    }
}

 

 در اینجا یک کنترلر را مشاهده می‌کنید که در اکشن متد Image آن، نام یک فایل دریافت شده و سپس این نام در پوشه App_Data/Images جستجو گردیده و نهایتا در مرورگر کاربر Flush می‌شود. از آنجائیکه الزامی ندارد fileName، واقعا یک fileName صحیح باشد، نیاز است توسط متد استاندارد Path.GetFileName این نام دریافتی اندکی تمیز شده و سپس مورد استفاده قرار گیرد. همچنین جهت کاهش بار سرور، از یک OutputCache به مدت یک روز نیز استفاده گردیده است.

 نحوه استفاده از این اکشن متد نیز به نحو زیر است:

1
<img src="@Url.Action(actionName: "Image", controllerName: "Home", routeValues: new { fileName = "EF_Stra_08.gif" })" />

 ب) آیا فراخوان تصویر ما را مستقیما در سایت خودش قرار داده است؟

1
2
3
4
5
6
7
8
9
private bool isEmbeddedIntoAnotherDomain
{
    get
    {
        return this.HttpContext.Request.UrlReferrer != null &&
               !this.HttpContext.Request.Url.Host.Equals(this.HttpContext.Request.UrlReferrer.Host,
                                                           StringComparison.InvariantCultureIgnoreCase);
    }
}

 در ادامه توسط خاصیت سفارشی isEmbeddedIntoAnotherDomain درخواهیم یافت که درخواست رسیده، از دومین جاری صادر شده است یا خیر. اینکار توسط بررسی UrlReferrer ارسال شده توسط مرورگر صورت می‌گیرد. اگر Host این UrlReferrer با Host درخواست جاری یکی بود، یعنی تصویر از سایت خودمان فراخوانی شده‌است.

ج) افزودن خودکار Watermark در صورت کپی شدن در سایتی دیگر

1
2
3
4
5
6
private byte[] addWaterMark(string filePath, string text)
{
    var image = new WebImage(filePath);
    image.AddTextWatermark(text);
    return image.GetBytes();
}

 کلاسی در فضای نام System.Web.Helpers وجود دارد به نام WebImage که کار افزودن Watermark را بسیار ساده کرده است. نمونه‌ای از نحوه استفاده از آن‌ را در متد فوق ملاحظه می‌کنید.
اما ... پس از امتحان تصاویر مختلف ممکن است گاها با خطای زیر مواجه شویم:

1
A Graphics object cannot be created from an image that has an indexed pixel format.

 مشکل از اینجا است که تصاویر با فرمت ذیل برای انجام کار Watermark پشتیبانی نمی‌شوند:

1
2
3
4
5
6
7
PixelFormatUndefined
PixelFormatDontCare
PixelFormat1bppIndexed
PixelFormat4bppIndexed
PixelFormat8bppIndexed
PixelFormat16bppGrayScale
PixelFormat16bppARGB1555

 اما می‌توان تصویر دریافتی را ابتدا تبدیل به BMP کرد و سپس Watermark دار نمود:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private byte[] addWaterMark(string filePath, string text)
{
    using (var img = System.Drawing.Image.FromFile(filePath))
    {
        using (var memStream = new MemoryStream())
        {
            using (var bitmap = new Bitmap(img))//avoid gdi+ errors
            {
                bitmap.Save(memStream, ImageFormat.Png);                       
                var webImage = new WebImage(memStream);
                webImage.AddTextWatermark(text, verticalAlign: "Top", horizontalAlign: "Left", fontColor: "Brown");
                return webImage.GetBytes();
            }
        }
    }
}

 در اینجا نمونه اصلاح شده متد addWaterMark فوق را بر اساس کار با تصاویر bmp و سپس تبدیل آن‌ها به png، ملاحظه می‌کنید. به این ترتیب دیگر به خطای یاد شده بر نخواهیم خورد.
در ادامه، قسمت آخر کار، اعمال این مراحل به اکشن متد Image است:

1
2
3
4
5
6
7
if (isEmbeddedIntoAnotherDomain)
{
    var text = Url.Action(actionName: "Index", controllerName: "Home", routeValues: null, protocol: "http");
    var content = addWaterMark(path, text);
    return File(content, MediaTypeNames.Image.Gif, fileName);
}
return File(path, MediaTypeNames.Image.Gif, fileName);

 در اینجا اگر تشخیص داده شود که تصویر، در دومین دیگری لینک شده است، آدرس سایت ما به صورت خودکار در بالای تصویر درج خواهد شد.


نویسنده : ن ع
جمعه 9 اسفند‌ماه سال 1392

پیوندهای روزانه
امکانات وبلاگ