冷风.NET

    ---默默無聞
posts - 24, comments - 198, trackbacks - 4, articles - 55
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

防止圖片在WEB頁面上下載

Posted on 2005-08-11 19:40 冷风.net 阅读(2957) 评论(22)  编辑 收藏 所属分类: DONET

今天應項目的要求做了個防止IE中圖片被下載的東東!
需說不是絕對的,但對於一般人來說來是可以的---個人認為:)
下面來看看實現個程吧!

1. 前台界面:

 1<asp:DataList ID="dgClient" Runat="server" RepeatColumns="2">
 2    <ItemStyle Width="50%"></ItemStyle>
 3    <ItemTemplate>
 4        <table>
 5            <tr>
 6                <td>
 7                    <img src='./ShowImage.aspx?PATH=<%# Server.UrlEncode(DataBinder.Eval(Container.DataItem,"DTSmallImage").ToString())%>' border='0' width="133" height="100" />
 8                </td>
 9                <td class="intro0">
10                    <%#DataBinder.Eval(Container.DataItem,"DTTitle"%>
11                    <br>
12                    會員免費下載<br>
13                    >><href='<%#DataBinder.Eval(Container.DataItem,"DTBigImage") %>'>下載1024*768 </a>
14                    <br>
15                    >><href='<%#DataBinder.Eval(Container.DataItem,"DTSmallImage") %>'>下載800*600 </a>
16                    <br>
17                </td>
18            </tr>
19        </table>
20    </ItemTemplate>
21</asp:DataList>

其主要為以下這句代碼:
<img src='./ShowImage.aspx?PATH=<%# Server.UrlEncode(DataBinder.Eval(Container.DataItem,"DTSmallImage").ToString())%>' border='0' />
其上語句是通過ShowImage.aspx文件來緩存輸出圖片,以達到顯示的只是圖片的影象效果,而不存在其實際圖片.所以在HTML代碼中看到的也只是<img src='./ShowImage.aspx?PATH=2005811184295.jpg' border='0'>,從而因無法獲得圖片路徑而不能下載,當然一般來說截頻可以獲得到對應的圖片,那麼下面看看
我是怎麼防止用戶截頻來獲得正確的圖片的吧
2.ShowImage.aspx文件的後台代碼
 1string path = Request.QueryString["PATH"];
 2string EArtURL = ConfigurationSettings.AppSettings["EArtURL"];
 3path = EArtURL + "/NetWorkMamage1/DeskTopSmallImages/" +  path;
 4System.Net.WebClient client = new System.Net.WebClient();
 5string ExpFileName = FileLib.GetFileExName(path);
 6string LocalPath = Server.MapPath("./new111." + ExpFileName );
 7if(System.IO.File.Exists(LocalPath))
 8{
 9    FileLib.DeleteFile(LocalPath);
10}

11client.DownloadFile(path,LocalPath);
因以上圖片都是放在其它WEB站台下面,所以采用以上簡單的代碼來保存到
當前站台下面的臨時文件中,圖上為當前目錄下的new111.jpg,因顯示的圖片是不確定的個數也不確定,所以保存前先刪除掉其下原來的臨時文件,已保正
當前臨時文件為最新的文件
1System.IO.StreamReader reader = new System.IO.StreamReader(LocalPath);
2
3System.IO.Stream stream = reader.BaseStream;
4byte[] bys = new byte[stream.Length];
5stream.Read(bys,0,(int)stream.Length);
6System.IO.MemoryStream memory = new System.IO.MemoryStream(bys,0,(int)stream.Length);
7stream.Close();
如前台所示,因在一個頁面要顯示多個圖片,而臨時文件又只有一個,如沒
有以上代碼那麼在下載第二個臨時文件時,定會因第一個文件正在使用而無
法保存,怎麼說:大家想想一般緩沖輸出圖片都是將這個圖片所占的硬盤空
間讀入到內存中再輸出,因現在只存在一個臨時圖片文件,後來的文件確需
要刪除先前的文件以保持最新的操作(即DataList每次邦定時都會調用ShowImage.aspx文件來顯示當前圖片),但當前文件雙在使用中需無法刪除或
保存,所以本人才采用以上代碼來創建當前圖片文件的一個備份放入MemoryStream,再結束對實際圖片的調用stream.Close();
1ImagesEntry.ScaleImagesLib scanle = new ImagesEntry.ScaleImagesLib();
2                if(scanle.Create(memory,133,100))
3                {
4                    scanle.Show();
5                }

6                if(scanle.LastError!=null)
7                {
8                    //輸出出錯圖片
9                }

以上代碼是對圖片對進縮放處理
還可以對要顯示的圖片加上透明,水印,模糊處理等等,總之能讓其截頻出
也達不到實際的效果。

以上是偶的一定愚見   

      還望大多多指正:) 

Feedback

#1楼    回复  引用    

2005-08-11 21:41 by 小生有礼 [未注册用户]

IE临时文件夹中有图片吗?
你上面的所有代码不都是在服务器端操作吗?
一旦到客户端,它最终还是要在Local端要有图片呀?

#2楼    回复  引用    

2005-08-11 23:50 by lazy [未注册用户]
想不让别人保存图片是不可能的。且勿论这种方法在服务器端设置有用没用,拿个DC对着屏幕一拍,“卡嚓”……

#3楼    回复  引用  查看    

2005-08-11 23:51 by Teddy's Knowledge Base      
你这样做基本上是徒劳的,ie中直接在图片上点右键save picture as...还是可以另存为的,浏览器会自动识别图片的二进制格式,并且本地肯定会有缓存。理论上来讲除非你把图片包含在java applet或flash中,取起来才比较麻烦(截屏不算)。很多图片站点为了访下载和盗资源一般也就加加水印什么的,以达到在下来的图片总敲着自己网站的“印章”的效果。

#4楼    回复  引用  查看    

2005-08-12 08:18 by 难得一蠢      
还是加个水印吧..其他都是徒劳的..类似这样的东西以前在JS和ASP的时候都被讨论了N边了..

#5楼 [楼主]   回复  引用  查看    

2005-08-12 08:56 by 冷风.net      
呵呵,沒看到後來的圖片是經過處理的嗎?
只是為了不讓其得到真實圖片

#6楼    回复  引用  查看    

2005-08-12 10:12 by Lion      
根据页面中的图片地址不是还可以找到图片的src吗?

#7楼    回复  引用    

2005-08-12 10:49 by 小峰 [未注册用户]
Print Screen

#8楼    回复  引用  查看    

2005-08-12 14:18 by 冷風.net      
當前顯示的只是要下載圖片的一個處理後的鏡像而以
如需下載的話那麼就需顯示下載而轉到其它頁來下載,
所以本頁是無法顯示下載圖片路徑的,已至無法下載

#9楼    回复  引用  查看    

2005-08-15 15:24 by myrat      
你讲了一堆,根本跟怎么防止下载没关系啊?除了最后提到用水印的那几句

#10楼    回复  引用  查看    

2005-08-23 13:42 by PointNet      
to:
Teddy's Knowledge Base

要是把右键另存为。。和截屏键 屏蔽了呢

你说本地有缓存,放在什么地方呢!

#11楼 [楼主]   回复  引用  查看    

2005-08-23 15:27 by 冷风.net      
他說的是C:\Documents and Settings\limin_he\Local Settings\Temporary Internet Files這個目錄下的,但這個文件是經過處理的下載過去也沒有用的

#12楼    回复  引用    

2005-09-09 13:35 by 过路人 [未注册用户]
浪费时间,不知在说什么

#13楼    回复  引用    

2005-10-11 21:45 by ScriptBaby [未注册用户]
这样的研究其实都是浪费时间

#14楼    回复  引用    

2005-10-11 21:52 by ScriptBaby [未注册用户]
注意WriteFile方法
或者Write方法

我觉得你绕了很大的弯子

#15楼    回复  引用    

2006-03-22 14:24 by Johnsuna [未注册用户]
这样做效率低下且没有意义。

#16楼    回复  引用  查看    

2006-04-03 03:31 by 晓风残月      
还是使用水印吧,这样作没有多大意义啊,打上你的烙印才是永恒^_^

#17楼    回复  引用  查看    

2006-04-05 22:39 by S.Sams      
用Flash和Aspx程序结合起来就可以达到这种效果.也不是绝对,但一定会比这个好.我现在就是这样做的.

#18楼    回复  引用  查看    

2006-04-05 22:40 by S.Sams      
这种做法是可以限制别人引用不了你的图片信息,如果别人引用了可以直接输出一张Logo的图片信息.其实就是防盗链.

#19楼    回复  引用  查看    

2006-04-05 22:43 by S.Sams      
补充: 用Flash和Aspx程序结合起来就可以达到这种效果.也不是绝对,但一定会比这个好.我现在就是这样做的.
再加上Javascript脚本,把截屏的动作取消. 其实就是当页面的焦点失去时就把剪贴板清空,或者重新赋一个值给它.即可把现在已截屏在剪贴板的内容重置为空.

#20楼    回复  引用  查看    

2006-04-06 00:15 by 垃圾猪      
晕,如果是正常图片在临时文件夹会有一份,你怎么保护!

#21楼    回复  引用  查看    

2007-04-12 13:58 by yunhuasheng      
哈哈,好像这个也是很难保护吧。

#22楼    回复  引用    

2008-04-06 17:04 by LBC [未注册用户]
<img src='./ShowImage.aspx?PATH=<%# Server.UrlEncode(DataBinder.Eval(Container.DataItem,"DTSmallImage").ToString())%>' border='0' width="133" height="100" />

这是什么意思能显示图片吗

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: