Отправка Zip-файла клиенту с помощью ответа - отправляется неверный тип - PullRequest
1 голос
/ 26 октября 2010

Хорошо, я вырывал свои волосы об этом целую вечность. У меня есть веб-сервис, который отправляет zip-файл в браузер. Это работает; когда я тестирую WebService и напрямую «вызываю» метод через него, zip-файл корректно загружается в браузер.

Проблема возникает, когда я использую jQuery для отправки запроса AJAX в WebService - файл ZIP загружается в ответ, но остается в ответе и не загружается в виде файла.

Вот мой код:

        HttpContext.Current.Response.ClearHeaders();
        HttpContext.Current.Response.ClearContent();
        HttpContext.Current.Response.ContentType = "application/zip";
        HttpContext.Current.Response.AddHeader("content-disposition", "attachment;         filename=pleasework.zip");


        using (ZipFile zip = new ZipFile())
        {
            zip.AddDirectory("c:\\inetpub\\mediaserver\\music\\mixes");
            zip.AddFile("c:\\test.txt");
            zip.AddFile("c:\\test2.txt");
            zip.Save("c:\\filename.zip");
        }
        HttpContext.Current.Response.TransmitFile("c:\\iloveshrooms.zip");
        return "done";        
}

Теперь это работает, поскольку файл загружается, когда я использую функцию «invoke» при переходе непосредственно к сервису.

Вот мой запрос jQuery AJAX ...

function getFile() {
            alert("sending POST request...");
            $.ajax({
                type:   'POST',
                url:    'ZipService.asmx/GetZipFile HTTP 1.1',
                contentType: "application/x-www-form-urlencoded",
                data:   '{ "path":"c:\\inetpub\\mediaserver\\music\\mixes"  }',
                dataType: '',
                beforeSend: function(xhr) {xhr.setRequestHeader("Accept","application/zip");},
                success: function() {alert(":-)");},
                failure: function() {alert(":-(");}
            });
        }

Я добавил код в beforeSend, чтобы запрос явно указывал, какой ответ должен ожидать браузер.

Я использую Firebug для мониторинга заголовков запросов / ответов и не вижу в них ничего плохого (кроме случаев, когда я смотрю на содержимое ответа, оно заполнено двоичными данными И имеет тот же размер, что и файл). Я отправляю.

Я только что попытался загрузить снимки экрана заголовков запроса / ответа и содержимого ответа, но у меня пока недостаточно репутационных очков, чтобы сделать это: - (

Размер ответа такой же, как и у файла Zip, поэтому я предполагаю, что он отправляется обратно в браузер, но браузер не знает, что с ним делать.

Протестировано в IE, FF & Chrome и результаты соответствуют.

Если бы кто-нибудь мог пролить свет на это, я был бы очень признателен!

Ответы [ 2 ]

1 голос
/ 26 октября 2010

Есть несколько простых решений.

Преобразуйте процедуру вашего сервера в запрос GET, вы можете использовать window.open, чтобы инициализировать загрузку.

window.open('your_procedure_url?parameter=xyz')

Если вы хотите придерживаться POST, вы можете создать скрытую форму с входными данными для каждого из параметров. Установите для действия формы значение POST для URL-адреса службы и используйте form.submit() для запуска загрузки.

0 голосов
/ 12 ноября 2010

первый.Не делайте это веб-сервисом.Если он всегда доставляет zip-файл, почему это не aspx или ashx?Ресурс, запрашиваемый сценарием, не обязательно должен быть ASMX.

2й.это неправда, что вы не можете получить бинарный файл в AJAX или javascript.Вы можете.Например, см. Распаковка zip-архивов с использованием Javascript .

Но убедитесь, что вы действительно хотите обработать zip-файл в скрипте.В большинстве случаев вы хотите позволить пользователю сохранить файл zip в файловой системе.

...