проблема с отдачей файлов

drouZ

Новичок
загружаю файлы на сервер, храню название файла (с расширением в базе) при выгрузке с сайта файлов наблюдаю картину: все файлы получаются в кодировке utf-8, что делает их "битыми", что примечательно, на сервере они хранятся вполне себе нормально в "родной" кодировке. функция скачивания:
PHP:
 function download($id)
    {
        $q = $this->db->query("SELECT * FROM files WHERE id={$id}");
        $result = $q->FetchRow();

            if (file_exists($this->filepath.$result["hash"]))
            {           
                header('Content-Description: File Transfer');
                header('Content-Type: application/octet-stream');
                header('Content-Disposition: attachment; filename=' . $result["fnmae"]);
                header('Content-Transfer-Encoding: binary');
                header('Expires: 0');
                header('Cache-Control: must-revalidate');
                header('Pragma: public');
                header('Content-Length: ' . filesize($this->filepath.$result["hash"]));
                // читаем файл и отправляем его пользователю
                if ($fd = fopen($this->filepath.$result["hash"], 'rb')) {
                    while (!feof($fd)) {
                        print fread($fd, 1024);
                    }
                    fclose($fd);
                }
                exit;
            }
            else
                return 404;//не найдено
    }
причем, файлы с кодировкой utf-8 возвращает преспокойно и без "битостей". Сайт весь в UTF-8, главная страница без BOM.
Как только не бился и не пытался, не могу понять, что делаю не так.
 

drouZ

Новичок
файлы лежат на сервере, в закрытой папке. в базе названия.
 

drouZ

Новичок
Спасибо за помощь, с бедой разобрался следующим образом:
PHP:
 public function download($id)
    {
        $q = $this->db->query("SELECT * FROM files WHERE id={$id}");
        $result = $q->FetchRow();

            if (file_exists($this->filepath.$result["hash"]))
            {
                ob_end_clean();

                header('Content-Description: File Transfer');
                header('Content-Type: application/octet-stream');
                header('Content-Disposition: attachment; filename='.$result["fnmae"]);
                header('Content-Transfer-Encoding: binary');
                header('Expires: 0');
                header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                header('Pragma: public');
                header('Content-Length: ' . filesize($this->filepath.$result["hash"]));
                ob_clean();

                readfile($this->filepath.$result["id"]);
                exit;
            }
            else
                return 404;//не найдено
 
    }
осталось только 1 беда - огнелис по какой-то причине не читает имя файла и его расширение. :)
 

Gas

может по одной?
PHP:
header('Content-Disposition: attachment; filename="'.urlencode($result["fnmae"])).'"';
а так?
 

drouZ

Новичок
все русские названия выводит кодированные в строку урл.
Вернул как было у меня, но заметил, что такая беда только с "многословными" названиями, то есть на "Новый текстовый документ (2).txt" он выводит только "Новый", на "тест.txt" выводит нормально. Спасибо, навели меня на путь истинный.
 

riff

Новичок
PHP:
	header('Pragma: public');
	header('Expires: 0');
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Cache-Control: public');
	header('Content-Description: File Transfer');

	header('Content-Type: text/plain');
	//header('Content-Type: application/zip'); //для zip

	header('Content-Disposition: attachment; filename=Это тестовый файл.txt;');
	header('Content-Transfer-Encoding: binary');

	readfile(...);
--- добавлено
наверно я вопрос недопонял и ответ не о том. Попытаюсь ещё раз перечитать, а пока пусть так полежит.
 

fixxxer

К.О.
Партнер клуба
- header('Content-Disposition: attachment; filename=Это тестовый файл.txt;');
+ header('Content-Disposition: attachment; filename="Это тестовый файл.txt"');
 
Сверху