处理MVC.net中多个文件上传的最佳方式

本文关键字:最佳 方式 文件 MVC net 处理 | 更新日期: 2023-09-27 18:03:42

我有一个表单,我可以将一个或多个文档(文件路径和名称)(pdf, excel,图片,kml)链接到Land对象。我不知道什么是最好的方法来处理这个问题,我搜索并发现了很多方法,但似乎没有一个是正确的方法。我不能在AJAX中这样做,因为我的对象在创建新数据库时没有保存在数据库中。如果我发布表单,有一个错误,视图返回,但我的"上传"的文档将被清除(因为它的文件输入)。此外,我应该如何处理这个对象的编辑,以显示我的文档列表,并允许删除/添加其他或仅编辑名称?

是否有文件处理程序存在,我已经看到http://nuget.org/List/Packages/microsoft-web-helpers,但它看起来不是很有趣

处理MVC.net中多个文件上传的最佳方式

. NET MVC上传扩展很好。http://demos.telerik.com/aspnet-mvc/razor/upload

我尝试过plupload和jquery文件上传

Jquery文件上传工作得最好,因为plupload混淆了表单提交,我不能得到防伪造令牌工作(还!)。

你也可以考虑上传,但我自己还没有尝试过。

telerik库仅对某些项目免费,例如开源/非商业项目。

这里是代码我放在一起使用的jQuery文件上传…

 @section Header
{
    <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/themes/base/jquery-ui.css"
        id="theme" />
    <link href="/Content/plugins/jqUpload/files/jquery.fileupload-ui.css" rel="stylesheet"
        type="text/css" />
    <link href="/Content/plugins/jqUpload/style.css" rel="stylesheet" type="text/css" />
}
<div id="fileupload" class="grid_24">
    @using (@Html.BeginForm("Upload", "Photo", new { Model.Id }, FormMethod.Post, new { enctype = "multipart/form-data" }))
 { 
        @Html.AntiForgeryToken()
        <div class="fileupload-buttonbar">
            <label class="fileinput-button">
                <span>Add files...</span>
                <input type="file" name="files" multiple="multiple" />
            </label>
            <button type="submit" class="start">
                Start upload</button>
            <button type="reset" class="cancel">
                Cancel upload</button>
            <button type="button" class="delete">
                Delete files</button>
        </div> 
 }
    <div class="fileupload-content">
        <table class="files">
        </table>
        <div class="fileupload-progressbar">
        </div>
    </div>
</div>
<div class="clear"></div>
<script id="template-upload" type="text/x-jquery-tmpl">
    <tr class="template-upload{{if error}} ui-state-error{{/if}}">
        <td class="preview"></td>
        <td class="name">${name}</td>
        <td class="size">${sizef}</td>
        {{if error}}
            <td class="error" colspan="2">Error:
                {{if error === 'maxFileSize'}}File is too big
                {{else error === 'minFileSize'}}File is too small
                {{else error === 'acceptFileTypes'}}Filetype not allowed
                {{else error === 'maxNumberOfFiles'}}Max number of files exceeded
                {{else}}${error}
                {{/if}}
            </td>
        {{else}}
            <td class="progress"><div></div></td>
            <td class="start"><button>Start</button></td>
        {{/if}}
        <td class="cancel"><button>Cancel</button></td>
    </tr>
</script>
<script id="template-download" type="text/x-jquery-tmpl">
    <tr class="template-download{{if error}} ui-state-error{{/if}}">
        {{if error}}
            <td></td>
            <td class="name">${name}</td>
            <td class="size">${sizef}</td>
            <td class="error" colspan="2">Error:
                {{if error === 1}}File exceeds upload_max_filesize (php.ini directive)
                {{else error === 2}}File exceeds MAX_FILE_SIZE (HTML form directive)
                {{else error === 3}}File was only partially uploaded
                {{else error === 4}}No File was uploaded
                {{else error === 5}}Missing a temporary folder
                {{else error === 6}}Failed to write file to disk
                {{else error === 7}}File upload stopped by extension
                {{else error === 'maxFileSize'}}File is too big
                {{else error === 'minFileSize'}}File is too small
                {{else error === 'acceptFileTypes'}}Filetype not allowed
                {{else error === 'maxNumberOfFiles'}}Max number of files exceeded
                {{else error === 'uploadedBytes'}}Uploaded bytes exceed file size
                {{else error === 'emptyResult'}}Empty file upload result
                {{else}}${error}
                {{/if}}
            </td>
        {{else}}
            <td class="preview">
                {{if thumbnail_url}}
                    <a href="${url}" target="_blank"><img src="${thumbnail_url}"></a>
                {{/if}}
            </td>
            <td class="name">
                <a href="${url}"{{if thumbnail_url}} target="_blank"{{/if}}>${name}</a>
            </td>
            <td class="size">${sizef}</td>
            <td colspan="2"></td>
        {{/if}}
        <td class="delete">
            <button data-type="${delete_type}" data-url="${delete_url}">Delete</button>
        </td>
    </tr>
</script>
@section Scripts
{
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js"></script>
    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js"></script>
    <script src="/Content/plugins/jqUpload/files/jquery.iframe-transport.js" type="text/javascript"></script>
    <script type="text/javascript" src="/Content/plugins/jqUpload/files/jquery.iframe-transport.js"></script>
    <script type="text/javascript" src="/Content/plugins/jqUpload/files/jquery.fileupload.js"></script>
    <script type="text/javascript" src="/Content/plugins/jqUpload/files/jquery.fileupload-ui.js"></script>
    <script src="/Content/plugins/jqUpload/application.js" type="text/javascript"></script>
}

和控制器…

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Upload(int? id, IEnumerable<HttpPostedFileBase> files)
        {
            foreach (var file in files)
            {
                if (file.ContentLength > 0)
                {
                    var fileName = id + "_" + Path.GetFileName(file.FileName);
                    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
                    file.SaveAs(path);
                }
            }
            return Json(new {name = fileName, type = "image/jpeg"});
        }