الف) نیاز است ارائه تصاویر تحت کنترل برنامه باشند.
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); |
در اینجا اگر تشخیص داده شود که تصویر، در دومین دیگری لینک شده است، آدرس سایت ما به صورت خودکار در بالای تصویر درج خواهد شد.
6506515148یک راه مطمئن و درآمدزا برای کسانیکه مایلند از صفر شروع نموده و از هیچ به همه چیز برسند درآمد بسیار زیاد , آسان , مطمئن و قانونی برای صاحبان سایتها , وبلاگها و بازاریابها با هر بازدید و سابقه فعالیتی که دارید به گروه ما بپیوندید.
http://earn-money.11r.biz
سلام دوست عزیز
وبلاگ عالیی داری
به ما هم سری بزن
منتظر حضور گرمتون هستم
بهترین ها رو برات آرزو مندم