佛山软件定制

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   New.min  阅读(1073)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

点击右上角即可分享
微信分享提示