Как мне получить плагин Uploadify jQuery для работы с ASP.NET MVC? - PullRequest
35 голосов
/ 16 июня 2009

Я пытаюсь заставить плагин jQuery Uploadify работать с ASP.NET MVC.

У меня есть плагин, который хорошо показывает следующий фрагмент JavaScript:

<script type="text/javascript">
    $(document).ready(function() {
        $('#fileUpload').fileUpload({
            'uploader': '/Content/Flash/uploader.swf',
            'script': '/Placement/Upload',
            'folder': '/uploads',
            'multi': 'true',
            'buttonText': 'Browse',
            'displayData': 'speed',
            'simUploadLimit': 2,
            'cancelImg': '/Content/Images/cancel.png'
        });
    });
</script>

Кажется, все хорошо. Если вы заметили, атрибуту «script» присвоено значение my / Placement / Upload, которое является моим контроллером мест размещения и моим действием загрузки.

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

Я пытался изменить сигнатуру метода на основе этой статьи :

public string Upload(HttpPostedFileBase FileData)
{
    /*
    *
    * Do something with the FileData
    *
    */
    return "Upload OK!";
}

Но это все равно не срабатывает.

Может кто-нибудь помочь мне написать и правильно получить подпись действия контроллера загрузки, чтобы он действительно срабатывал? Затем я могу справиться с данными файла самостоятельно. Мне просто нужна помощь, чтобы запустить метод действия.

Ответы [ 6 ]

20 голосов
/ 21 августа 2009
public string Upload(HttpPostedFileBase FileData) {}

правильно - файл, загруженный при загрузке, будет привязан к FileData. Нет необходимости заходить в Request.Files для получения файла, что затрудняет его проверку и проверку.

Если ваше действие вообще не запускается (т. Е. Попробуйте отладку и посмотрите, не достигнута ли точка останова в методе), тогда ваша проблема, скорее всего, является значением 'script' - вы работаете в виртуальном каталоге? Если это так, вам нужно поставить имя каталога впереди. Uploadify использует абсолютный путь.

т.е. 'script:' / virtual_directory / Placement / Upload '

прямо сейчас uploadify отправляет на http://localhost/Placement/Upload.

также попробуйте использовать отладчик маршрута (http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx), чтобы проверить, где отображается ваш маршрут.

10 голосов
/ 15 июля 2009

Проблема может заключаться в том, что вам нужно указать, что загружаемое действие имеет значение Post ... оно не будет работать с действием в качестве действия Get.

Итак, это:

public string Upload(HttpPostedFileBase FileData)
{
   //do something
}

Должно быть так:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Upload(HttpPostedFileBase FileData)
{
   //do something
}

Кроме того, имейте в виду, что если вы используете это в разделе «залогинены» на вашем сайте, вам следует поискать здесь известную ошибку с uploadify и аутентификацией: http://geekswithblogs.net/apopovsky/archive/2009/05/06/working-around-flash-cookie-bug-in-asp.net-mvc.aspx

Кроме того, в MVC есть несколько способов обработки загрузки файлов (используя Request.Files согласно предложению Рори Фитцпатрика, а также передавая файл HttpPostedFileBase в качестве аргумента в определении действия). Это не должно иметь большого значения, чтобы заставить Uploadify работать.

2 голосов
/ 07 декабря 2010

Мое полное решение этой проблемы может решить вашу проблему. Надеюсь, это поможет.

http://zootfroot.blogspot.com/2010/12/mvc-file-upload-using-uploadify-with.html

2 голосов
/ 16 июня 2009

Это не то, как я должен был осуществлять загрузку файлов вообще. У меня был метод действия без параметров, который использовал текущий объект Request для погружения в коллекцию опубликованных файлов.

Пример кода из моей реализации:

[AcceptVerbs(HttpVerbs.Post)]
public ContentResult Upload() {
    if (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0) {
        HttpPostedFileBase postedFile = Request.Files[0];
        // Do something with it
    }
}

Конечно, написание тестов для этого становится PITA. Чтобы заставить его работать, нужно смоделировать несколько объектов, например:

var mockHttpContext = mocks.StrictMock<HttpContextBase>();
var mockRequest = mocks.StrictMock<HttpRequestBase>();
var postedFile = mocks.StrictMock<HttpPostedFileBase>();

var postedFileKeyCollection = mocks.StrictMock<HttpFileCollectionBase>();

mockHttpContext.Expect(x => x.Request).Return(mockRequest).Repeat.Any();
mockRequest.Expect(x => x.Files).Return(postedFileKeyCollection).Repeat.Any();

postedFileKeyCollection.Expect(x => x[0]).Return(postedFile).Repeat.Any();
postedFileKeyCollection.Expect(x => x.Count).Return(1);

postedFile.Expect(f => f.ContentLength).Return(1024);
postedFile.Expect(f => f.InputStream).Return(null);

Было бы проще создать интерфейс для публикуемых файлов и только издеваться над ним, с конкретной реализацией, введенной в ваш контроллер с помощью IoC.

Я думаю, что это в значительной степени основано на этом посте: Реализация загрузки файлов HTTP с ASP.NET MVC, включая тесты и проверки

0 голосов
/ 07 сентября 2013

Вот мой простой вид Razor (мастер компоновки имеет комплекты Javascript)

@{
ViewBag.Title = "Upload Email CSV";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<script type="text/javascript" src="@Url.Content("~/Scripts/Uploadify/jquery.uploadify.js")"></script>

<script type="text/javascript">

$(function () {
    var uploadUrl = "@Url.Content("~/UploadFile/UploadEmailCSV/")";
    var uploadSWF = "@Url.Content("~/Scripts/Uploadify/uploadify.swf")";
    var uploadifyButtonImage = "@Url.Content("~/Scripts/Uploadify/uploadify.swf")";

    $('#file_upload').uploadify({
        'fileSizeLimit': '0',
        'buttonImage': '/uploadify/browse-btn.png',
        'swf': uploadSWF,
        'uploader': uploadUrl,
        'onUploadSuccess': function(file, data, response) {
            alert('The file was saved to: ' + data);
        }
    });
});
</script>
<h2>Upload a comma separated list of email addresses</h2>
@using (Html.BeginForm("UploadEmailCSV", "UploadFile", FormMethod.Post, new { @class = "form-horizontal", @enctype = "multipart/form-data", @id = "frmUploadFiles" }))
{
    <input type="file" name="file_upload" id="file_upload" />
}

Вот метод Contoller

public ActionResult UploadEmailCSV()
    {
        var uploadedFile = Request.Files["Filedata"];

        if (uploadedFile != null && uploadedFile.ContentLength > 0)
        {
            var filePath = Path.Combine(Server.MapPath("~/UploadedFiles"), string.Format("{0}_{1}{2}", Path.GetFileNameWithoutExtension(uploadedFile.FileName), DateTime.Now.Ticks, Path.GetExtension(uploadedFile.FileName)));
            uploadedFile.SaveAs(filePath);
            return Content(string.Format("{0}_{1}{2}", Path.GetFileNameWithoutExtension(uploadedFile.FileName), DateTime.Now.Ticks, Path.GetExtension(uploadedFile.FileName)));

        }
        return Content("Error Uploading file!");
    }

Вот так!

0 голосов
/ 16 июня 2009

Читая документацию, похоже, что он отправляет массив файлов. Вы пробовали:

public string Upload( HttpPostedFileBase[] fileData )

Также возможно, что механизм связывания модели по умолчанию не будет работать с HttpPostedFileBase, и вам придется либо использовать механизм Рори, либо написать собственный механизм связывания модели.

...