send_file в rails удаляет последние 4 КБ файла размером 16 КБ при отправке клиенту

#iphone #ruby-on-rails

#iPhone #ruby-on-rails

Вопрос:

Я загрузил PNG-изображение размером 16 кБ в базу данных photos на моем сервере разработки Rails, используя attachment_fu, и я могу просматривать PNG-изображение в браузере, указывающем на сервер разработки Rails. Так что эта часть работает нормально.

Когда я загружаю файл в свое приложение для iPhone и просматриваю данные, полученные методом «didReceiveData», у меня возникают две проблемы:

  1. Иногда удаляются последние 4 КБ файла PNG, поэтому получается только 12 КБ.
  2. В других случаях отправляется только 4 КБ или 8 кБ, а полученные части изображения PNG не входят в эти 4 или 8 кБ.

Первое происходит, когда я изменяю параметр в send_file (например, buffer_size на 16 КБ) и перезапускаю сервер. Это заставляет меня думать, что на сервере разработки происходит какое-то кэширование. В противном случае, если я не изменил параметр и не перезапустил сервер, произойдет # 2 выше.

Чтобы попытаться исправить 1, остановив кэширование на сервере разработки, я

A) добавлен в config/environments/development.rb :

    config.cache_classes = true
   config.action_controller.perform_caching = false
  

Б) и добавил следующий код в контроллер:

   response.headers.delete("Pragma")
  response.headers.delete('Cache-Control')
  response.headers["Expires"] = "#{1.year.ago}"
  

Ниже приведен код, в котором send_file вызывается в контроллере:

   user_photo = Photo.find_by_id(334)
  @p = user_photo

  send_file("#{RAILS_ROOT}/public"   @p.public_filename,
            :disposition   => 'inline',
            :encoding      => 'binary',
            :type          => @p.content_type,
            :stream        => false,
            :filename      => URI.encode(@p.filename),
            :buffer_size   =>  4096
  )
  

Мой метод connectionDidFinishLoading выглядит следующим образом:

 -(void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];
[theConnectionData release];
}
  

Есть идеи, почему изображение PNG урезается на 4 КБ или время от времени файл вообще не отправляется?

Комментарии:

1. Способ отправки файлов существенно отличается в зависимости от вашего веб-сервера и стека промежуточного программного обеспечения. Это происходит в вашей среде разработки, верно? Используете ли вы WEBrick, Mongrol, другое?

Ответ №1:

Я думаю, это тот случай, когда не используется

 - (void)connectionDidFinishLoading:(NSURLConnection *)connection
  

Отправляется после успешного завершения загрузки соединения.

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

Комментарии:

1. Я использую connectionDidFinishLoading. Я добавил этот код выше. Есть ли что-то, чего мне не хватает при использовании connectionDidFinishLoading? Должен ли я просматривать данные, полученные в connectionDidFinishLoading вместо didReceiveData?

2. Понял. connectionDidFinishLoading сообщает мне, что все данные были получены.