Задача на очередном проекте стоит так: приватный метод скачивания файлов (нужны ограничения по траффику) и отображение flash-роликов (SWF) в поле filefild.
Ролик вставляется через [module=swftools]. Пока стоит публичный метод загрузки адрес файла выглядит /sites/default/files/имя_файла.swf и ролик отображается. Как только выставляю приватный метод скачивания файлов и адрес файла становится /system/files/имя_файла.swf, то ролик не отображается. А надо. Кстати, по обеим ссылкам файл скачивается нормально.
Проверка показала, что по адресу /sites/default/files/имя_файла.swf сервер отдает примерно такие заголовки:
Date: Sat, 12 Sep 2009 02:09:52 GMT
Server: Apache
Last-Modified: Sat, 12 Sep 2009 01:20:09 GMT
ETag: "282919d-35433-473573bc5a440"
Accept-Ranges: bytes
Content-Length: 218163
Cache-Control: max-age=1209600
Expires: Sat, 26 Sep 2009 02:09:52 GMT
Connection: close
Content-Type: application/x-shockwave-flash
А по адресу /system/files/имя_файла.swf – примерно такие:
Date: Sat, 12 Sep 2009 02:09:55 GMT
Server: Apache
X-Powered-By: PHP/5.2.5
Set-Cookie: SESSd956c0494e978422f8172fd5d7172b7f=332ee93d106fe7af769d53d3e421da75; expires=Mon, 05 Oct 2009 05:43:15 GMT; path=/; domain=.домен.ru
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Sat, 12 Sep 2009 02:09:55 GMT
Cache-Control: private
Content-Length: 218163
Content-Disposition: attachment; filename=имя_файла.swf
Connection: close
Content-Type: application/x-shockwave-flash; name=имя_файла.swf
Понятно, что причина такого поведения зарыта в заголовках ETag, Accept-Ranges, Cache-Control, Content-Disposition или Content-Type. С этим разберусь. Но заголовки формируются в ядре Drupal (includes/file.inc). И что теперь делать? Конечно на данном проекте, я могу и ядро похачить, но проблема принципиальная. Может у кого есть решение? Или в багтрекер на drupal.org писать и ждать апдейтов.
Я кагбэ даже удивлен, что данный вопрос не поднимался.
Upd: Решение вторым комментом.
Комментарии
Такие вот дела - http://www.adobe.com/devnet/flashplayer/articles/fplayer10_security_chan...
Starting with version 10,0,2, if Flash Player sees a "Content-Disposition: attachment" header while downloading a SWF file, it will ignore the SWF file rather than play it. Note that this restriction applies only to SWF files and not to other types of content, such as images, sounds, text, or XML files, policy files, etc.
Получается надо удалять этот заголовок из отправляемых сервером.
Но как теперь совместить проигрывание ролика с его скачиванием? Данный заголовок нужен для информирования браузера об имени файла. Это если "чистые ссылки" не включены.
Два решения проблемы:
1 Хак файла file.inc.
Первой строчкой функции file_transfer($source, $headers) ставим строчку:
2. Реализация hook_file_download в своём модуле
return array('Content-disposition:');
}
В этом случае сервер отдает заголовки:
Date: Fri, 18 Sep 2009 07:18:31 GMT
Server: Apache
X-Powered-By: PHP/5.2.5
Set-Cookie: SESSd956c0494e978422f8172fd5d7172b7f=d5e3070b29cadb731b827b26557db50b; expires=Sun, 11 Oct 2009 10:51:51 GMT; path=/; domain=.domain
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Fri, 18 Sep 2009 07:18:31 GMT
Cache-Control: private
Content-Length: 61224
Content-Disposition:
Connection: close
Content-Type: application/x-shockwave-flash
Апач собирает все заголовки, но отдает последний из переданных PHP. А Adobe Flash Player на пустой Content-disposition не реагирует. Сохранение файлов при этом работает нормально в IE? FF и Opera при режиме чистых ссылок. Как без них не пробовал. И не знаю правильно ли это с точки зрения спецификации HTTP