佛山软件定制

asp.net mvc实现图片下载防盗链及提示是否存在!

首先声明此方法对服务器影响很大:
目的:用file/图片名称代替files/图片名称访问,自定义无图片提示和防盗链

在gobal.ascx中添加规则:

 routes.MapRoute(
                
"Image",
                
"file/{fileName}",
                
new { controller = "file", action = "producePics" },
                
new { fileName = @"^(\w+).(\w+)$" }
                );

创建images文件夹新建两张图片.nopic.png和notallowlink.png
把图片文件放在Files文件夹下(该例子中放了6张图片),等下我们用file/图片名称代替files/图片名称访问

创建File controller并创建Index action

        public ActionResult Index()
        {
            DirectoryInfo dir 
= new DirectoryInfo(Server.MapPath("~/files/"));
            FileInfo[] files
=dir.GetFiles();

            ViewData[
"dirinfo"]="该文件夹下共有"+files.Length+"个文件";
            
foreach (FileInfo file in files)
            {
                ViewData[
"imagelist"+= "<li><a href=\"/file/" + file.Name+ "\"><img src=\"" +
                    "/file/" + file.Name + "\"/></a></li>";
            }
            
return View();
        }

创建 Index view

Code

扩展FileController


   
using System.IO;
   
    
public class FileController : Controller
    {
        
public FileResult ProducePic(string fileName)
        {
            
//00:00:00.0039062  最差的
             /*
         FileStream fs=new FileStream(Server.MapPath("~/files/"+fileName),FileMode.Open,FileAccess.Read);
             byte[] buffer=new byte[fs.Length];
             fs.Read(buffer, 0, buffer.Length);
             fs.Flush();
             fs.Close();
             return File(buffer, "Image/JPEG");
*/

            
//00:00:00.0029297 (刷新几次发现偶尔为00:00:00.00009611)
            
//FileStream fs = new FileStream(Server.MapPath("~/files/" + fileName),FileMode.Open,FileAccess.Read);
            
//return File(fs, "Image/JPEG");

            
//00:00:00.0029296 处理最快的方法 (多刷新几次发现基本为00:00:00.00000011)
            
//return File(Server.MapPath("~/files/") + fileName, "Image/JPEG");


            
//如果不存在图片则显示无图提示的图片
            /*
            FileInfo file = new FileInfo(Server.MapPath("~/files/") + fileName);
            if (!file.Exists) file = new FileInfo(Server.MapPath("~/files/") + "nopic.jpg");
            FileStream fs = new FileStream(file.FullName, FileMode.Open, FileAccess.Read);
            FileResult files = File(fs, "Image/JPEG");
            fs.Flush();
            return files; 
*/


            
string filePath = null;
            
bool isAllowLink=Request.Url.Host == "localhost";               //是否允许外部链接
            if (!isAllowLink)
            {
                filePath 
= Server.MapPath("~/images/"+ "notallowlink.png";
            }
            
else
            {
                filePath 
= Server.MapPath("~/files/"+ fileName;           //获取图片地址
                if (!System.IO.File.Exists(filePath))                       //图片不存在的话显示提示的图片
                    filePath = Server.MapPath("~/images/" + "nopic.png");
            }
            
return File(filePath, "Image/GIF");
        }
    }

实现结果如下:


http://www.cnyolee.com

posted on 2009-09-01 10:56  New.min  阅读(1059)  评论(0编辑  收藏  举报

导航