Как мне заставить плагин jQuery Uploadify работать с ASP.NET MVC?
-
05-07-2019 - |
Вопрос
Я пытаюсь получить плагин jQuery, Загрузить, для работы с 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» установлен в мой /Placement/Upload, который является моим контроллером размещения и моим действием загрузки.
Основная проблема в том, что мне трудно запустить это действие для получения файла.Я установил точку останова для этого действия, и когда я выбираю файл для загрузки, он не выполняется.
Я пробовал изменить подпись метода на основе Эта статья:
public string Upload(HttpPostedFileBase FileData)
{
/*
*
* Do something with the FileData
*
*/
return "Upload OK!";
}
Но это все еще не срабатывает.
Может ли кто-нибудь помочь мне правильно написать и получить подпись действия контроллера загрузки, чтобы она действительно сработала?Тогда я смогу сам справиться с данными файла.Мне просто нужна помощь в запуске действия метода.
Решение
public string Upload(HttpPostedFileBase FileData) {}
верно - файл, загруженный с помощью uploadify, будет привязан к FileData.Нет необходимости заходить в Request.Files для получения файла, что усложняет имитацию и тестирование.
Если ваше действие вообще не срабатывает (т.попробуйте отладку и посмотрите, не достигнута ли точка останова внутри метода), тогда ваша проблема, скорее всего, связана со значением «script» - вы работаете в виртуальном каталоге?В этом случае вам нужно будет указать имя каталога впереди.Uploadify использует абсолютный путь.
то есть'скрипт:'/виртуальный_каталог/Размещение/Загрузить'
прямо сейчас uploadify отправляется на http://localhost/Placement/Загрузить.
также попробуйте использовать отладчик маршрутов (http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx), чтобы проверить, куда прокладывается ваш маршрут.
Другие советы
Возможно, проблема заключается в том, что вам нужно указать, что загружаемое действие имеет значение 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 работать.
Это совсем не то, как мне пришлось осуществлять загрузку файлов. У меня был метод действия без параметров, который использовал текущий объект 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.
Я думаю, что это в значительной степени основано на этом посте:
Мое полное решение этой проблемы может решить вашу проблему. Надеюсь, это поможет.
Читая документацию, похоже, что он отправляет массив файлов. Вы пробовали:
public string Upload( HttpPostedFileBase[] fileData )
Также возможно, что механизм связывания модели по умолчанию не будет работать с HttpPostedFileBase, и вам придется либо использовать механизм Рори, либо написать собственный механизм связывания модели.
Вот мой простой вид 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!");
}
Вот и все!