zoukankan      html  css  js  c++  java
  • mvc上传

    1.在视图中显示上传按钮

    <div class="control-group">
                            <label class="control-label">资料附件:</label>
                            <div class="controls">
                                    <input type="file" id="DataAppend" style="display:none" value="上传" />
                                    <input type="text" style="600px" readonly="true" id="showtxt" name="DataAppend" value="@Model.DataAppend"  />
                                    <input type="button" id="sc" name="name" value="上传" />
                            </div>
                        </div>

    一个type='file' 的input  一个type='button'的input

    在js中写点击上传事件

     $("#sc").click(function () {
                $("#DataAppend").click();
            })
            $('#DataAppend').fileupload({
                dataType: 'json',
                url: "/HOS/Apprentice/SmritiDataUpload",
                progressall: function (e, data) {
                    var progress = parseInt(data.loaded / data.total * 100, 10);
                    $('#progress .bar').css({ 'width': progress + '%', 'height': '5px' }
                    );
                },
                done: function (e, data) {
                    debugger;
                    if (data.result[0].result != "OK") {
                        $('#progress .bar').css({ 'width': '0%', 'height': '0px' });
                        alert(data.result[0].result);
                    }
                    else {
                        debugger;
                        $("#showtxt").val(data.result[0].url);
                    }
                }
            });

    点击上传按钮时实现上传事件 .fileupload()

    走入后台控制器SmritiDataUpload方法

     [HttpPost]
            public ActionResult SmritiDataUpload()
            {
                var result = new List<ViewDataUploadFilesResult>();
                try
                {
                    foreach (string file in Request.Files)
                    {
                        var statuses = new List<ViewDataUploadFilesResult>();
                        var headers = Request.Headers;
    
                        if (string.IsNullOrEmpty(headers["X-File-Name"]))
                        {
                            UploadWholeFile(Request, statuses, "file");
                        }
                        else
                        {
                            UploadPartialFile(headers["X-File-Name"], Request, statuses);
                        }
    
                        JsonResult jsonresult = Json(statuses);
                        jsonresult.ContentType = "text/plain";
    
                        return jsonresult;
                    }
                    return Json(result);
                }
                catch (Exception)
                {
                    throw;
                }
            }

    上面的方法中包含两个方法,一个是UploadWholeFile()和UploadPartialFile()方法

    当不存在headers["X-File-Name"]时走入UploadWholeFile()方法===上传多个文件,存在走入UploadPartialFile()方法

    在UploadWholeFile()文件中 需要先判断上传文件的文件类型是否是有效文件

       private string ISValid(HttpPostedFileBase file, string dirName)
            {
                //定义允许上传的文件扩展名
                Hashtable extTable = new Hashtable();
                extTable.Add("image", "gif,jpg,jpeg,png,bmp");
                extTable.Add("flash", "swf,flv");
                extTable.Add("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
                extTable.Add("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2,pdf");
                //extTable.Add("file", "doc,docx,pdf");
                //最大文件大小
                int maxSize = 2000000;
                String fileName = file.FileName;
                String fileExt = Path.GetExtension(fileName).ToLower();
    
                if (file.InputStream == null || file.InputStream.Length > maxSize)
                {
                    return "上传文件大小超过限制。";
                }
    
                if (String.IsNullOrEmpty(fileExt) || Array.IndexOf(((String)extTable[dirName]).Split(','), fileExt.Substring(1).ToLower()) == -1)
                {
                    return "上传文件扩展名是不允许的扩展名。
    只允许" + ((String)extTable[dirName]) + "格式。";
                }
                return "OK";
            }

    将有效的文件类型

    上传各种文件类型之前首先要对上传的文件进行验证,检验是否是有效文件。如果需要添加新的文件类型,可以在哈希表中添加新的键值。

    下面贴出UploadWholeFile()和UploadPartialFile()方法

     private void UploadWholeFile(HttpRequestBase request, List<ViewDataUploadFilesResult> statuses, string type = "image")
            {
                for (int i = 0; i < request.Files.Count; i++)
                {
                    string result = ISValid(request.Files[i], type);
                    if (result != "OK")
                    {
                        statuses.Add(new ViewDataUploadFilesResult() { result = result });
                    }
                }
                if (statuses.Count > 0) return;
                for (int i = 0; i < request.Files.Count; i++)
                {
                    var file = request.Files[i];
    
                    if (!Directory.Exists(StorageRoot))
                    {
                        Directory.CreateDirectory(StorageRoot);
                    }
                    string fileExt = Path.GetExtension(file.FileName).ToLower();
                    Log4NetHelper.Error(LoggerType.WebExceptionLog, "原文件名:" + file.FileName, null);
                    string newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
                    Log4NetHelper.Error(LoggerType.WebExceptionLog, "新文件名:" + newFileName, null);
                    var fullPath = Path.Combine(StorageRoot, newFileName);
                    file.SaveAs(fullPath);
                    ViewDataUploadFilesResult fileResult = new ViewDataUploadFilesResult()
                    {
                        result = "OK",
                        name = newFileName,
                        size = file.ContentLength,
                        type = file.ContentType,
                        url = Path.Combine(path, Path.GetFileName(newFileName)),
                        delete_type = "GET",
                        oldname = file.FileName,
                    };
                    if (type == "image")
                    {
                        fileResult.thumbnail_url = @"data:image/png;base64," + EncodeFile(fullPath);
                    }
                    statuses.Add(fileResult);
                }
            }
    private void UploadPartialFile(string fileName, HttpRequestBase request, List<ViewDataUploadFilesResult> statuses)
            {
                if (request.Files.Count != 1) throw new HttpRequestValidationException("Attempt to upload chunked file containing more than one fragment per request");
                var file = request.Files[0];
                string result = ISValid(file, "image");
                if (result != "OK")
                {
                    statuses.Add(new ViewDataUploadFilesResult() { result = result });
                }
                if (statuses.Count > 0) return;
                var inputStream = file.InputStream;
                if (!Directory.Exists(StorageRoot))
                {
                    Directory.CreateDirectory(StorageRoot);
                }
                string fileExt = Path.GetExtension(file.FileName).ToLower();
                string newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
                var fullName = Path.Combine(StorageRoot, newFileName);
    
                using (var fs = new FileStream(fullName, FileMode.Append, FileAccess.Write))
                {
                    var buffer = new byte[1024];
    
                    var l = inputStream.Read(buffer, 0, 1024);
                    while (l > 0)
                    {
                        fs.Write(buffer, 0, l);
                        l = inputStream.Read(buffer, 0, 1024);
                    }
                    fs.Flush();
                    fs.Close();
                }
                ViewDataUploadFilesResult fileResult = new ViewDataUploadFilesResult()
                {
                    result = "OK",
                    name = newFileName,
                    size = file.ContentLength,
                    type = file.ContentType,
                    url = Path.Combine(path, Path.GetFileName(newFileName)),
                    delete_type = "GET",
                };
                if (fileExt.Contains("gif,jpg,jpeg,png,bmp"))
                {
                    fileResult.thumbnail_url = @"data:image/png;base64," + EncodeFile(fullName);
                }
                statuses.Add(fileResult);
            }
  • 相关阅读:
    Unity PhysicsScene测试
    游戏编程精粹学习
    Unity StreamingMipmaps 简单测试
    稀疏贴图 SparseTexture
    前端工程师是怎样一种职业
    web资源预加载-生产环境实践
    2019年终总结——三十而立
    一种前端灰度发布方案
    2018年终总结——越过山丘
    记录一个前端bug的解决过程
  • 原文地址:https://www.cnblogs.com/jiangyou-lz/p/6373856.html
Copyright © 2011-2022 走看看