connectionDidFinishЗагрузка вызвана ранее didReceiveData с производством рельсов, отправляющим фотографии - PullRequest
0 голосов
/ 28 февраля 2012

У меня есть веб-сайт rails 3.0.3, который в режиме разработки отвечает на HTTP-запрос GET, вызывая didReceiveData, а затем connectionDidFinishLoading, и данные фотографий отправляются с веб-сайта на iPhone и отображаются правильно. Но когда я запускаю веб-сайт rails 3.0.3 в производственном режиме на веб-сервисах Amazon, connectionDidFinishLoading вызывается раньше, чем didReceiveData. Я использую carrierwave для обработки фотографий для сайтов разработки и производства.

Кто-нибудь знает, что может вызвать вызывание connectionDidFinishLoading перед didReceiveData?

Я пытался проверить следующее:

1) Я убедился, что NSURLConnectionDelegate вызывается для интерфейса класса.

2) didReceiveResponse не вызывается до connectionDidFinishLoading и statusCode = 200.

3) В приложении rails я использую send_file для отправки данных фотографии, а путь к файлу, отправленному в производство, является реальной фотографией.

4) Проверка с полным запросом к веб-сайту показала, что с производственного веб-сайта возвращалось 0 байт данных с использованием приведенного ниже кода в connectionDidFinishLoading (это стало причиной того, что didReceiveData не вызывался):

NSData *returnedData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://production_website"]];

Вот код для didReceiveData:

// theConnectionData is an instance variable defined as:

      NSMutableData  *theConnectionData = [[NSMutableData data] retain];


-(void)connection:(NSURLConnection *)con didReceiveData: (NSData *)data {

[theConnectionData   appendData:data ];

}

Обновление - Я думаю, что проблема может быть на стороне рельсов. Вот код, который я использую для отправки фотографии из приложения rails из локального хранилища на AWS в приложение iPhone:

  @p       = Photo.find_by_user_id(user_id)
  uploader = @p.avatar
  uploader.retrieve_from_store!(File.basename(@p.avatar.url))
  uploader.cache_stored_file!

      send_file(uploader.file.path,
                :disposition   => 'inline',
                :encoding      => 'binary',
                :type          => @p.content_type,
                :stream        => false,
                :filename      => URI.encode(@p.filename),
                :x_sendfile    => true,
                :buffer_size   => 16384
                )

Кто-нибудь имеет представление о том, почему ReceptionData не вызывается до подключения ConnectionDidFinishLoading для веб-сайта производства рельсов?

1 Ответ

0 голосов
/ 02 марта 2012

Я наконец понял это.Закомментирование следующего в config / environment / production.rb исправило проблему:

# config.action_dispatch.x_sendfile_header = "X-Sendfile"

Проблема также была исправлена ​​путем замены указанной выше строки в config / environment / production.rb следующим:

config.action_dispatch.x_sendfile_header = "X-Accel-Redirect"

Согласно этой записи похоже, что в Rails 3 были внесены некоторые изменения для send_file.В этом сообщении предлагается использовать подход X-Accel-Redirect, но в сообщении утверждается, что запрос затем отправляется из приложения rails, а не из nginx.В этом сообщении утверждается, что nginx требует подхода X-Accel-Redirect.

...