Передача пути загруженного файла в действие контроллера с помощью uploadify

Я использую uploadify в своем проекте MVC3. Он отлично работает для загрузки нескольких файлов и сохранения в папки.

Как передать путь загруженного файла в действие контроллера? -- Мне нужно передать его действию ExtractingZip моего контроллера.

Чтобы извлечь содержимое файла .zip, я использую библиотеку DotNetZip.

Вот что я пробовал до сих пор.

$('#file_upload').uploadify({
            'checkExisting': 'Content/uploadify/check-exists.php',
            'swf': '/Content/uploadify/uploadify.swf',
            'uploader': '/Home/Index',
            'auto': false,
            'buttonText': 'Browse',
            'fileTypeExts': '*.jpg;*.jpeg;*.png;*.gif;*.zip',
            'removeCompleted': false,
            'onSelect': function (file) {
                if (file.type == ".zip") {
                    debugger;
                    $.ajax({
                        type: 'POST',
                        dataType: 'json',
                        url: '@Url.Action("ExtractingZip", "Home")',
                        data: ({ fileName: file.name}), // I dont see a file.path to pass it to controller
                        success: function (result) {
                            alert('Success');
                        },
                        error: function (result) {
                            alert('error');
                        }
                    });
                }

            }
});

Вот мое действие контроллера:

   [HttpPost]
            public ActionResult ExtractingZip(string fileName,string filePath, HttpPostedFileBase fileData)
            {

                string zipToUnpack = @"C:\Users\Public\Pictures\Sample Pictures\images.zip";// I'm unable to get the filePath so i'm using the path.
                string unpackDirectory = System.IO.Path.GetTempPath();

                using (ZipFile zip1 = ZipFile.Read(zipToUnpack))
                {
                    // here, we extract every entry, but we could extract conditionally
                    // based on entry name, size, date, checkbox status, etc.  
                    var collections = zip1.SelectEntries("name=*.jpg;*.jpeg;*.png;*.gif;");

                    foreach (var item in collections)
                    {
                        item.Extract(unpackDirectory, ExtractExistingFileAction.OverwriteSilently);
                    }
                }
                return Json(true);
            }

[HttpPost]
        public ActionResult Index(IEnumerable<HttpPostedFileBase> fileData)
        {

                foreach (var file in fileData)
                {
                    if (file.ContentLength > 0)
                    {
                        string currpath;

                        currpath = Path.Combine(Server.MapPath("~/Images/User3"), file.FileName);
                        //save to a physical location
                        file.SaveAs(currpath);
                    }
                }
        }

person Karthik Chintala    schedule 14.12.2012    source источник
comment
Насколько вы привязаны к загрузке?   -  person Ben Tidman    schedule 17.12.2012
comment
Нет. Я только начинаю загружать файлы. Но если я не использую onSelect в uploadify, я могу прочитать данные файла .zip с помощью HttpPostedFileBase.   -  person Karthik Chintala    schedule 17.12.2012
comment
Итак, вы используете onselect, чтобы попытаться сделать это запросом ajax? Я никогда не использовал Uploadify сам, но у меня сложилось впечатление, что ajax был поведением отправки по умолчанию.   -  person Ben Tidman    schedule 17.12.2012
comment
Да, точно. если я не использую onSelect и когда я помещаю отладчик в Index, он срабатывает при загрузке файла, и я также могу видеть данные и сохранять их.   -  person Karthik Chintala    schedule 17.12.2012
comment
Итак, почему вы пытаетесь использовать onselect? Или ваша проблема уже решена?   -  person Ben Tidman    schedule 17.12.2012
comment
Если выбранный файл является файлом .zip, я хочу извлечь из него все images, вот в чем причина использования onSelect в uploadify.   -  person Karthik Chintala    schedule 17.12.2012
comment
Подождите, хотя. Если вы не используете onSelect, вы получаете содержимое файла.. Т.е. fileData не равен нулю? Итак, решение, которое я разместил для вас, работает? Вы должны просто иметь возможность использовать fileData.InputStream прямо сейчас?   -  person Ben Tidman    schedule 17.12.2012
comment
да. Я не могу получить fileData.InputStream в IntelliSense.   -  person Karthik Chintala    schedule 18.12.2012
comment
Это странно. На какую версию .net нацелен ваш проект. Это свойство должно быть там, если вы не ориентируетесь на .net 3.0 или ниже msdn.microsoft.com/en-us/library/   -  person Ben Tidman    schedule 18.12.2012
comment
.net 4.0 — моя версия проекта   -  person Karthik Chintala    schedule 18.12.2012
comment
а fileData по-прежнему имеет тип HttpPostedFileBase и не равен нулю?   -  person Ben Tidman    schedule 18.12.2012
comment
Эй, я могу получить fileData.InputStream   -  person Karthik Chintala    schedule 18.12.2012
comment
Отлично, попробуйте и дайте мне знать, если это сработает   -  person Ben Tidman    schedule 18.12.2012
comment
Да, это HttpPostedFileBase, и при отладке он равен нулю. Если я не укажу onSelect, я увижу, что fileData не равен нулю. Если я передам через $.ajax fileData будет нулевым   -  person Karthik Chintala    schedule 18.12.2012
comment
Пытаюсь понять. Зачем вам нужен onSelect? Разве Uploadify по умолчанию не выполняет запросы ajax?   -  person Ben Tidman    schedule 18.12.2012
comment
На самом деле, если я загружу файл .zip, он должен автоматически выдать мне все файлы изображений в файле .zip. Итак, если я использую onSelect, я могу отсортировать все файлы изображений в zip-файле. Я не понимаю, какой параметр передать действию контроллера, чтобы я мог получить желаемое   -  person Karthik Chintala    schedule 18.12.2012
comment
хм.. пытаюсь понять. Похоже, у вас есть код С# для распаковки zip-файла, чтобы вы могли работать с отдельными изображениями в коде С#. Вы пытаетесь распаковать zip перед отправкой на контроллер? Почему?   -  person Ben Tidman    schedule 18.12.2012
comment
Нет, если бы я мог видеть данные в своем действии контроллера, я мог бы разархивировать в какой-нибудь временный файл. После отправки данных на контроллер он разархивирует или распакует zip-файл в другое место.   -  person Karthik Chintala    schedule 18.12.2012
comment
Хорошо, я все еще пытаюсь понять. Когда вы не используете Onselect, вы правильно получаете данные файла в своем действии контроллера? Это данные файла для заархивированного файла, который вы загружаете, не так ли? Так что я не понимаю, в чем вам еще нужна помощь. Просто не используйте OnSelect, и вы сможете распаковать zip в своем контроллере.   -  person Ben Tidman    schedule 18.12.2012
comment
Да, я мог бы это сделать, но мне нужно отобразить файлы в формате .zip, которые необходимо загрузить.   -  person Karthik Chintala    schedule 18.12.2012
comment
Можно ли отображать изображения после их загрузки? Если это так, я бы рекомендовал этот путь: загрузите zip в действие контроллера, распакуйте zip и сохраните содержимое, как хотите, используйте это событие при загрузке uploadify.com/documentation/uploadify/onuploadcomplete, чтобы узнать, когда загрузка будет завершена. Сделайте запрос ajax или перейдите на новую страницу, которая возвращает все изображения, которые были в почтовом индексе. Оттуда вы можете добавить другие действия, такие как возможность удалять изображения, которые вам не нужны, и т. д. Либо так... либо просто пусть ваши пользователи сами распаковывают zip!!! :)   -  person Ben Tidman    schedule 18.12.2012


Ответы (2)


Вам не нужно передавать путь к файлу zip при его загрузке. Путь к файлу будет с клиентской машины, верно? Ваше приложение на вашем сервере не знает и не имеет доступа к файловой системе клиента.

Хорошая новость в том, что вам это не нужно. У вас уже есть содержимое вашего файла в памяти. Я никогда не использовал donetzip, но беглый поиск в Google показал, что вы можете читать zip-файлы прямо из потока.

Проверьте эти ссылки:

Не удается прочитать zip-файл из HttpInputStream с помощью DotNetZip 1.9

Извлечение zip из потока с помощью DotNetZip

Итак, используя эти сообщения в качестве основы для перехода... Похоже, вы сможете изменить свой код следующим образом:

            string zipToUnpack = @"C:\Users\Public\Pictures\Sample Pictures\images.zip";// I'm unable to get the filePath so i'm using the path.
            string unpackDirectory = System.IO.Path.GetTempPath();

            using (ZipFile zip1 = ZipFile.Read(zipToUnpack))
            {
                ....

Изменения к...

            string unpackDirectory = System.IO.Path.GetTempPath();

            using (ZipFile zip1 = ZipFile.Read(fileData.InputStream))
            {
                ....

Дайте мне знать, если это поможет.

person Ben Tidman    schedule 17.12.2012
comment
Даже я не могу получить fileData. Он содержит null - person Karthik Chintala; 17.12.2012
comment
добавьте это в действие вашего контроллера var fileUpload = Request.Files[0]; В нем есть данные вашего файла? - person Ben Tidman; 17.12.2012
comment
извини Бен. Даже я пробовал ранее с Request.Files[0], он ничего не возвращал. - person Karthik Chintala; 17.12.2012
comment
Спасибо за ваши предложения. Я мог бы как-то сделать это, как вы сказали, без использования onSelect. Я сделаю это таким образом. - person Karthik Chintala; 24.12.2012

Во-первых, из-за соображений безопасности у вас нет прямого доступа к клиентской машине. Пока пользователь загружает какие-то файлы, веб-браузеры создают один или два (обычно 1, согласно RFC) потока, а скрипт на стороне сервера считывает этот поток, поэтому не тратьте свое время на получение файлов непосредственно из пути к файлу на локальном компьютере пользователя.

Для извлечения архивов (например, Zip, Rar) я настоятельно рекомендую вам использовать SevenZipSharp. Это работает очень хорошо и легко с потоками, а также со многими форматами сжатия.

Поскольку они документированы, вы можете извлечь поток следующим образом:

using (MemoryStream msin = new MemoryStream(fileData.InputStream)) 
{ ... }
person Alireza    schedule 17.12.2012
comment
Спасибо. Могу ли я извлечь только указанные форматы с помощью SevenZipSharp. Я имею в виду, если файл .zip содержит все изображения. Мне нужно только получить файлы .jpg. Это возможно? - person Karthik Chintala; 17.12.2012
comment
@Karthik Для этого вам следует выполнить поиск в коллекции файлов архива. Свойство SevenZip.SevenZipExtractor.ArchiveFileData дает вам коллекцию имен файлов. Вы можете выполнить поиск внутри коллекции и выбрать, какой файл извлечь (скачать и прочитать документацию). - person Alireza; 18.12.2012
comment
Я не нашел никакой документации для SevenZipSharp в Codeplex - person Karthik Chintala; 18.12.2012
comment
попробуйте вкладку Загрузки, там есть ссылка на документацию. - person Alireza; 18.12.2012