MVC3 - при использовании HttpPostedFileBase с большими файлами RedirectToAction работает очень медленно - PullRequest
1 голос
/ 06 февраля 2012

Хорошо, у меня есть ситуация, которая, кажется, не имеет смысла.Таким образом, у меня есть контроллер:

public ActionResult Index()
{
    return View(_courseService.ListAllCourses());
}


[HttpPost]
public ActionResult CreateNewCourse(CourseVDO course, HttpPostedFileBase CourseDataFile)
{
        return RedirectToAction("Index");       
}

И представление таким образом:

@using (Html.BeginForm("CreateNewCourse", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(false)
    <fieldset>
        <legend>Course</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>

        <div class="editor-label">           
            Course Data File 
        </div>
        <div class="editor-field">                        
            <input type="file" name="CourseDataFile" id="CourseDataFile" />            
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Visible)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Visible)
            @Html.ValidationMessageFor(model => model.Visible)
        </div>

        <p>
            <input  type="submit" value="Create" />
        </p>
    </fieldset>
}

Когда я отправляю файл размером около 200 КБ, он загружается на сервер достаточно быстро (в конце концов он локальный), но затем требуется 5 секунд, чтобы перейти от строки «return RedirectToAction (« Index »);» к точке останова в «return View (_courseService.ListAllCourses ());»строка (на самом деле не выполняется ListAllCourses).Это означает, что это полностью зависит от внутренней сантехники.Хуже того, эта задержка зависит от размера файла.Что на земле происходит, и как я могу это остановить?

Спасибо

1 Ответ

2 голосов
/ 06 февраля 2012

Я никогда не использовал этот метод раньше, и это не прямой ответ, но, возможно, это лучшее решение:

 // used when editing an item
 public void UploadFiles(FormCollection form, NameValueCollection currentFiles, string folder, bool useTicks)
    {
        foreach (string file in Request.Files)
        {
            var hpf = Request.Files[file];

            if (hpf.ContentLength == 0)
            {
                form[file] = currentFiles[file];
            }
            else
            {
                var filename = useTicks ? hpf.FileName
                    .Replace(" ", "_")
                    .Replace(".", RandomFileName() + ".") : hpf.FileName;

                var myPath = Server.MapPath("~/Content/" + folder);
                hpf.SaveAs(myPath + "/" + filename);

                form[file] = filename;
            }
        }

        if (Request.Files.Count > 0) return;
        foreach (var file in currentFiles.AllKeys)
        {
            form[file] = currentFiles[file];
        }
    }

//used when creating a new item
    public void UploadFiles(FormCollection form, string folder, bool useTicks)
    {

        foreach (string file in Request.Files)
        {
            var hpf = Request.Files[file];

            if (hpf.ContentLength == 0)
            {
                form[file] = null;
            }
            else
            {
                var filename = "";
                filename = useTicks ?
                    hpf.FileName.Replace(" ", "_").Replace(".", RandomFileName() + ".") :
                    hpf.FileName;

                UploadFileName = filename;
                var myPath = Server.MapPath("~/Content/" + folder);
                hpf.SaveAs(myPath + "/" + filename);

                form[file] = UploadFileName;
            }

        }

    }

Я использую модели, поэтому в своей модели я использую UIHint ("uploadbox")

вот код внутри представлений / Shared / EditorTemplates / UploadField.cshtml

@Html.TextBox("",null,new{type="File"})

вот пример использования функции загрузки:

public ActionResult AddFiles(FormCollection form, SomeModel myModel)
    {
       UploadFiles(form,"products", true);
        myModel.pdfFile = form["pdffile"];
        myModel.thumbnail = form["thumbnail"];

вот код при редактировании элемента, если файл не был изменен, но другие элементы имеют

 var existingFile = ctx2.modelname.SingleOrDefault(x => x.Id == id).Filename;
        NameValueCollection myCol = new NameValueCollection();
        myCol.Add("Filename", existingFile);
        UploadFiles(form, myCol, "uploads/custom", true);

        myModel.Filename = form["Filename"];

просто мысль: -)

...