zoukankan      html  css  js  c++  java
  • MVC图片上传并显示缩略图

    前面已经说了怎么通过MVC来上传文件,那么这次就说说如何上传图片然后显示缩略图,这个的实用性还是比较大。用UpLoad文件夹来保存上传的图片,而Temp文件夹来保存缩略图,前面文件上传部分就不再重复了,不过图片上传当然只能是图片格式的文件,因此在之前那篇博客中 通过控制格式的上传便能防止恶意上传,这个是文件上传的教程链接:http://www.cnblogs.com/xmfdsh/p/3988868.html

    对于数据库的设计的话就随便点:

    捕获

    于是用EF便自动生成了类如下:

    public partial class Image
        {
            public int Id { get; set; }
            public string ImgName { get; set; }
            public string ImgSize { get; set; }
            public System.DateTime UpLoadTime { get; set; }
        }

    下面是缩略图产生的函数:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace UpLoadImg.Utilities
    {
        public class Thumbnail
        {
            public static void CreateThumbnail(string source,string destination,int maxWidth,int maxHeight)
            {
                System.Drawing.Image Img = System.Drawing.Image.FromFile(source);
                int Width = Img.Width;
                int Height = Img.Height;
                int thumbnailWidth, thumbnailHeight;
    
                Resize(Width, Height, maxWidth, maxHeight, out thumbnailWidth, out thumbnailHeight);
    
                System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(thumbnailWidth, thumbnailHeight);
                System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap);
    
                graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    
                graphics.DrawImage(Img, 0, 0, thumbnailWidth, thumbnailHeight);
                bitmap.Save(destination);
            }
    
            private static void Resize(int Width,int Height,int maxWidth,int maxHeight,out int sizedWidth,out int sizedHeight)
            {
                if(Width<maxWidth && Height<maxHeight)
                {
                    sizedWidth=Width;
                    sizedHeight=Height;
                    return ;
                }
                sizedWidth = maxWidth;
                sizedHeight = (int)((double)Height / Width * sizedWidth + 0.5);
                if(sizedHeight>maxHeight)
                {
                    sizedHeight = maxHeight;
                    sizedWidth = (int)((double)Width / Height * sizedHeight + 0.5);
                }
            }
        }
    }

    这种缩略图的函数网上一搜一大把,不过实现起来也不难,就像上面那样,我就不写注释,不过应该想看懂难度还是不大的。

    先说上传的过程,和上次是一样的,只不过这次需要在数据库中保存一些数据,因此上传后到了服务端便要对数据进行存储处理:

    [HttpPost]
            public ContentResult UpLoadFile(HttpPostedFileBase fileData)
            {
                if (fileData != null && fileData.ContentLength > 0)
                {
                    string fileSave = Server.MapPath("~/UpLoad/");
                    int size = fileData.ContentLength;
                    //获取文件的扩展名
                    string extName = Path.GetExtension(fileData.FileName);
                    //得到一个新的文件名称
                    string newName = Guid.NewGuid().ToString() + extName;
                    //给模型赋值
                    Image img = new Image();
                    img.ImgName = newName;
                    img.ImgSize = size.ToString() ;
                    img.UpLoadTime = System.DateTime.Now;
                    //保存图片的同时,保存images的数据的数据库
                    MVCEntities db = new MVCEntities();
                    db.Images.Add(img);
                    db.SaveChanges();
    
                    fileData.SaveAs(Path.Combine(fileSave, newName));
                }
                return Content("");
            }

    保存图片的同时,保持images的数据到数据库。

    Home中的视图便是用来显示保存所有已经保存的图片:html视图如下

    <body>
        <div>
            <table class="table" style="border-collapse: collapse;  60%;">
                <thead>
                    <tr>
                        <th style="border: 1px solid #0094ff;">ID</th>
                        <th style="border: 1px solid #0094ff;">Photo</th>
                        <th style="border: 1px solid #0094ff;">FileName</th>
                        <th style="border: 1px solid #0094ff;">Size</th>
                        <th style="border: 1px solid #0094ff;">UploadTime</th>
                    </tr>
                </thead>
                <tbody id="tbody1"></tbody>
            </table>
            <div id="dialog" style="display: none;" title="Dialog Title">
            </div>
        </div>
    </body>

    然后具体的数据应该通过js动态来加载:

    //html加载时候执行的方法
            $(document).ready(function () {
                $.ajax({
                    type: 'GET',
                    url: '/Home/GetAllUploadImg',//通过向这个url请求数据
                    dataType: 'json',
                    contentType: 'application/json; charset=utf-8',
                    success: function (data, textStatus) {
                        var tbody = $('#tbody1');
                        $.each(data, function (i, item) {
                            OutputData(tbody, item);//得到返回的数据后,动态加载到html中。
                        });
                    }
                });
            });

    通过引用jQuery UI的css和js库来实现点击缩略图显示原图:

    <link href="~/Content/themes/base/jquery-ui.css" rel="stylesheet" />
        <script src="~/Scripts/jquery-1.8.2.min.js"></script>
        <script src="~/Scripts/jquery-ui-1.8.24.js"></script>

    而函数function OutputData(tbody, item)的实现如下:

    function OutputData(tbody, item) {
                var uploadTime = new Date(parseInt(item.UpLoadTime.substr(6)));
                var uploadDate = uploadTime.getFullYear() + "-" + uploadTime.getMonth() + "-" + uploadTime.getDate();
                tbody.append("<tr>" +
                            "<td style="border: 1px solid #0094ff;">" +
                               item.Id +
                            "</td>" +
                            "<td style="border: 1px solid #0094ff;">" +
                                "<div id="DivImg" + item.Id + ""  />" +
                            "</td>" +
                            "<td style="border: 1px solid #0094ff;">" +
                                item.ImgName +
                            "</td>" +
                            "<td style="border: 1px solid #0094ff;">" +
                                item.ImgSize +
                            "</td>" +
                            "<td style="border: 1px solid #0094ff;">" +
                                uploadDate +
                            "</td>" +
                            "</tr>");
    
                var imgTag = $('#DivImg' + item.Id);
    
                $.get("/Home/GetThumbnailImage",
                 { ImgName: item.ImgName },
                 function (data) {
                     imgTag.html(data);
                 });
    
    
                imgTag.click(function () {
                    $("#dialog").dialog({
                        autoOpen: false,
                        position: 'center',
                        title: item.OldFileName,
                        draggable: false,
                         700,
                        height: 600,
                        resizable: true,
                        modal: true,
                    }).dialog("open");
    
                    $.get("/Home/GetImage",
                                { ImgName: item.ImgName },
                                function (data) {
                                    $('#dialog').html(data);
                                });
                });
            }

    服务端通过GetImage方法获取原图:

    public ContentResult GetImage(Image img)
            {
                string htmltag = htmltag = "<img id="img1"  src="/UpLoad/" + img.ImgName + ""/>";
                return Content(htmltag);
            }

    通过GetThumbnailImage(Image img)获取缩略图:

    public ContentResult GetThumbnailImage(Image img)
            {
                string ImgUrl = "~/UpLoad/" + img.ImgName;
                string TempImgUrl="~/Temp/"+img.ImgName;
                Thumbnail.CreateThumbnail(Server.MapPath(ImgUrl), Server.MapPath(TempImgUrl), 96, 96);
    
                string htmltag = htmltag = "<img id="img1"  src="/Temp/" + img.ImgName + ""/>";
                return Content(htmltag);
            }

    最后显示的效果如下:

    QQ截图20141019203659

    这一节貌似讲的有点乱,因为步骤有点多,而且需要实现和注意的地方不少,下面附上源码,有助于大家研究,有问题可以留言一起讨论:

    http://files.cnblogs.com/xmfdsh/MVC%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87%E6%98%BE%E7%A4%BA%E7%BC%A9%E7%95%A5%E5%9B%BE%E5%92%8C%E5%8E%9F%E5%9B%BE.zip

  • 相关阅读:
    Repeater OnItemCommand 失效
    继承类时的 this 和 base
    想当然造成的的错误
    排序算法二叉树
    href 一个正则表达式的解析 ? 号解析
    给父窗口添加新的代码
    ValidationSummary 控件
    交叉表 学习
    定向思维 C# datediff
    cookie 问题
  • 原文地址:https://www.cnblogs.com/xmfdsh/p/4035446.html
Copyright © 2011-2022 走看看