Jquery-upload-progress для нескольких доменов. Подозреваемая проблема запроса GET - PullRequest
1 голос
/ 02 августа 2009

Я делаю сайт, который отправляет форму на другой сервер. Для отслеживания хода загрузки я использую: для серверной части NginxHttpUploadProgressModule и для клиентской стороны - jquery-upload-progress . Я проверил настройки, отправив форму на тот же сервер, и все работало нормально. Отправка на другой сервер не показывает отслеживание хода выполнения (междоменный сценарий). После нескольких часов изучения этого вопроса я пришел к выводу, что запрос GET, сгенерированный JQuery, является ошибочным.

Запрос выглядит так:

http://domain.com/upload/progress/?X-Progress-ID=39b2825934dbb2f33fe936df734ff840&callback=jsonp1249230337707&_=1249230345572

С сайта NginxHttpUploadProgressModule:

HTTP-запрос к этому местоположению должен иметь либо параметр X-Progress-ID, либо HTTP-заголовок X-Progress-ID, содержащий уникальный идентификатор, указанный в вашем запросе загрузки / POST в соответствующую отслеживаемую зону. Если вы используете X-Progress-ID в качестве параметра строки запроса, убедитесь, что в URL указан аргумент LAST .

Итак, мой вопрос: как добавить параметр X-Progress-ID в конец запроса GET jquery или установить заголовок X-Progress-ID?

Это не работает с jsonp (код из jquery.uploadProgress.js):

beforeSend: function(xhr) {
   xhr.setRequestHeader("X-Progress-ID", options.uuid);
}

В настоящее время запрос генерируется следующим образом (код из jquery.uploadProgress.js):

jQuery.uploadProgress = function(e, options) {
 jQuery.ajax({
 type: "GET",
 url: options.progressUrl + "?X-Progress-ID=" + options.uuid,
 dataType: options.dataType,
 success: function(upload) {
 ...

Ответы [ 4 ]

2 голосов
/ 03 августа 2009

Я решил проблему с параметром GET (код из jquery.uploadProgress.js):

jQuery.uploadProgress = function(e, options) {
  jQuery.ajax({
  type: "GET",
  url: options.progressUrl,
  dataType: options.dataType,
  data: "X-Progress-ID=" + options.uuid,
  success: function(upload) {
  ...

Модифицированный запрос GET выглядит так:

http://domain.com/upload/progress/?callback=jsonp1249230337707&_=1249230345572&X-Progress-ID=39b2825934dbb2f33fe936df734ff840

Веб-сервер nginx теперь правильно отвечает.

Однако, как отметил Рон Эванс, часть отслеживания прогресса на стороне клиента не будет работать, пока не будет изменен NginxHttpUploadProgressModule.

0 голосов
/ 11 декабря 2009

Я сделал небольшую модификацию, которая решила проблему для меня, вы можете проверить это здесь:

http://github.com/tizoc/nginx-upload-progress-module/commit/a40b89f63b5a767faec3c78d826443a94dc5b126

0 голосов
/ 03 августа 2009

Вам также необходимо установить модуль Apache для статуса загрузки, просто использование плагина jQuery не будет работать.

Чтобы ответить Кену, предлагаю вам ознакомиться со спецификацией JSONP, поскольку JSONP был создан специально для обработки междоменных вызовов Javascript.

Так или иначе, этот код прекрасно работает в Passenger / Apache С моим модифицированным модулем Apache. Без изменения расширения для Nginx оно не будет работать с вызовом JSONP.

0 голосов
/ 03 августа 2009

Вы просто не можете запустить XmlHttpRequest с веб-страницы в домен, отличный от домена страницы. Это нарушает определения безопасности, которые используются по умолчанию во всех браузерах. единственное, что я могу подумать о том, что вы можете сделать, это использовать Flash или Silverlight для инициирования вызовов процесса (Flash и Silverlight могут, при правильной настройке crossdomain.xml, отправлять асинхронные запросы из браузера на предустановленный список доменов) или установите надстройку браузера (скажем, плагин Firefox, или IE ActiveX, или встроенный элемент управления WinForm), которая может инициировать вызовы без ограничения того же домена (так как запрос будет исходить не от веб-страницы, а от самого браузера)

...