文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

ASP.NETMVC解决上传图片脏数据的方法

2024-04-02 19:55

关注

在"在ASP.NET MVC下实现单个图片上传, 客户端服务端双重限制图片大小和格式, 服务端裁剪图片"中,已经实现了在客户端和服务端限制图片大小和格式,以及在服务端裁剪图片。但还有一个重要的话题是需要面对的,那就是图片脏数据问题。

假设用户添加产品信息,并且上传了图片,可之后用户没有点击页面上的添加按钮,这就导致上传图片成为"脏数据",存在着却一直不会被使用。解决这个问题的大致思路是:

假设,有这样的一个Model,它的ImageUrl属性,用来存放图片真正的相对路径。

    public class ImgVm
    {
        [Required(ErrorMessage = "必填")]
        public string ImageUrl { get; set; }
    }

在HomeController中,存在如下的一些Action:

        public ActionResult Index()
        {
            return View(new ImgVm());
        }
        [HttpPost]
        public ActionResult Index(ImgVm imgVm)
        {
            if (ModelState.IsValid)
            {
                //目标文件夹路径
                string pathForRealSaving = Server.MapPath("~/RealUpload/");
                //目标文件夹内的用户文件夹路径
                string pathForRealUserSaving = Server.MapPath("~/RealUpload/User001/");
                //当前文件路径
                string existingFilePath = Server.MapPath(imgVm.ImageUrl);
                //当前文件名,根据文件路径获得
                string existingFileName = Path.GetFileName(existingFilePath);
                if (CreateFolderIfNeeded(pathForRealSaving))
                {
                    if (CreateFolderIfNeeded(pathForRealUserSaving))
                    {
                        //根据当前文件路径获取当前文件
                        var existingfile = Path.GetFullPath(existingFilePath);
                        //获取目标文件夹内的目标文件
                        var realfile = Path.Combine(pathForRealUserSaving, existingFileName);
                        //把临时文件内的图片复制到目标文件夹内
                        System.IO.File.Copy(existingfile, realfile, true);
                        
                        //保存新的图片相对路径
                        imgVm.ImageUrl = "RealUpload/User001/" + existingFileName;
                    }
                }
              
                return View("showimg", imgVm);
            }
            else
            {
                return Index(imgVm);
            }
        }

Home/Index.cshtml中多了在上传图片成功后给id为ImageUrl隐藏域赋值的部分。

@model MvcApplication10.Models.ImgVm
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<style type="text/css">
    #msg {
        color: red;
    }
</style>
@using (Html.BeginForm("Index", "Home", FormMethod.Post, new {id = "addForm", @class = "form-horizontal"}))
{
    <input name="file" id="file" size="27" type="file" />
    <img src="~/images/ajax-loader.gif" id="indicator" style="display: none;" />
    <br />
    <div id="imgArea">
        <table id="tbl">
            <tbody>         
            </tbody>
        </table>
    </div>
    <div>
        <span id="msg"></span>
    </div>  
    
    <div>
        @Html.HiddenFor(m => m.ImageUrl)
        <input type="submit" value="提交"/>
    </div>
}
 
@section scripts
{
    <script src="~/Scripts/checkFileTypeAndSize.js"></script>
    <script type="text/javascript">
        $(function() {
            $("#file").checkFileTypeAndSize({
                allowedExtensions: ['jpg','jpeg','gif','png'],
                maxSize: 1024, //最大允许1024KB,即1MB
                success: function () {
                    //显示进度提示
                    $('#indicator').css("display", "block");
                    //清空提示内容
                    $('#msg').text('');
                    if ($('#fn').text().length > 0) {
                        //删除图片
                        deleteImg();
                    }
                    
                    //上传文件数据准备
                    var fd = new FormData();
                    fd.append('image', $('#file')[0].files[0]);
                    $.ajax({
                        url: '@Url.Action("UploadFile", "Home")',
                        type: "POST",
                        data: fd,
                        contentType: false,
                        cache: false,
                        processData: false,
                        dataType: 'json',
                        success: function (data) {
                            //隐藏进度提示
                            $('#indicator').css("display", "none");
                            if (data.isvalid) {
                                //$('#fileTemplate').tmpl(data).appendTo('#imgArea');
                                createTableTr();
                                $('#thumb').attr('src', data.filepath);
                                $('#fn').text(data.filename);
                                //清空上传文件框内容
                                $('#file').val('');
                                //给隐藏域赋值
                                $('#ImageUrl').val(data.filepath);
                            } else {
                                $('#msg').text(data.message);
                             }
                        }
                     });
                    
                },
                extensionerror: function () {
                    //alert('允许的格式为:jpg,jpeg,gif,png');
                    $('#msg').text('允许的格式为:jpg,jpeg,gif,png');
                    return;
                },
                sizeerror: function () {
                    //alert('最大尺寸1024KB,即1MB');
                    $('#msg').text('最大尺寸1024KB,即1MB');
                    return;
                }
            });
        });
        //删除图片
        function deleteImg() {
            $.ajax({
                cache: false,
                url: '@Url.Action("DeleteFileByName", "Home")',
                type: "POST",
                data: { smallname: $('#fn').text() },
                success: function (data) {
                    if (data.msg) {
                        $('#fn').parent().parent().remove();
                    }
                },
                error: function (jqXhr, textStatus, errorThrown) {
                    alert("出错了 '" + jqXhr.status + "' (状态: '" + textStatus + "', 错误为: '" + errorThrown + "')");
                }
            });
        }
        //创建表格
        function createTableTr() {
            var table = $('#tbl');
            table.append("<tr><td><img id='thumb' /></td><td colspan='2'><span id='fn'></span></td></tr>");
        }
    </script>
}

还有一个Home/showimg.cshtml视图,用来显示新的(相对临时文件夹中的那张图片)图片。

@model MvcApplication10.Models.ImgVm
@{
    ViewBag.Title = "showimg";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>showimg</h2>
<img src="@Model.ImageUrl"/>

当然,存放上传图片的临时文件夹是可以随时清理的。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对编程网的支持。如果你想了解更多相关内容请查看下面相关链接

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯