проблема со скачиванием файлов с использованием PHP-скрипта

darkvova

приведенный ниже код успешно скачивает файл, если его пытаться сохранить (выбрать вариант сохранить в появляющемся диалоге)
скаченный вариант успешно открывается


header("Content-type: " . $filetype);
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename=" . $filename);
header("Content-Length: " . filesize($src_name;

$fd = fopen($src_name, "rb");
while (!feof($fd
{
$content = fread($fd, 4096);
print $content;
}
fclose($fd);


но если попытаться файл открыть, то может выдаться сообщение, похожее на следующее:
Cannot open C:\Documents and Settings\...\<имя файла>
если кто-нибудь сталкивался с этой или аналогичный проблемой или
знает как с ней справиться, подскажите, пожалуйста, буду очень признателен
заранее благодарен

poshta

Есть такое подозрение, что файл, который скачивается, существует на диске только во время действия скрипта, а после окончания его действия удаляется (как при upload). Для того, чтобы сохранить файл, нужно перед fclose($fd); написать что-то вроде

fputs ($fd, $_SERVER['HTTP_USER_AGENT'] . "\n");

или

fwrite ($fd, $_SERVER['HTTP_USER_AGENT'] . "\n");


А может я и нагнал

darkvova

я попробовал, не помогло
значение параметра

$_SERVER['HTTP_USER_AGENT'] = Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Data Center; .NET CLR 1.1.4322)


с идеей (что файл удаляется) полностью согласен, скорее всего так оно и есть
но побороть это все никак не могу

poshta

Да, с fwrite я нагнал конечно
Попробуй тогда перед fclose($fd); вставить следующее:


// указываем путь и имя, вместо PATH поставь путь к директории, в которой надо сохранить файл.
$dir = 'PATH' . $filename;
copy($filename, $dir);


Правда, не знаю, может вместо $filename надо поставить $src_name, а может и нет... чем они отличаются?
Может так получится.

darkvova

идея хорошая
но нужно, чтобы по нажатию на кнопку Open стандартного диалога (стандатрного по крайней мере для Эксплорера) файл открывался в приложении, которое его открывает по умолчанию

сохранение и так происходит по нажатию на кнопку Save, эту опцию воспроизводить не надо
предложенный вариант позволит сохранить файл в другом месте на сервере, а это совсем не нужно
$filename - исходное имя файла
$src_name - путь к файлу на сервере

Dasar

Если отдаешь doc-файл, то попробуй Content Type поставить "application/msword"

Olenka

тип установлен
признаком тому строка в диалоге File type: Microsoft Document
тип устанавливается строкой (она не указана в исходном кдое)

header("Content-type: " . $file_type);


ЗЫ это я запостил вопрос - просто с другого логина

Dasar

А зачем тогда ты ставишь Content-Type равным application/force-download?

Olenka

к сожалению, я произвожу некоторые магические действия - как мне было предложено
точное их значение я пока не знаю
вроде, разобрался с этой проблемой, заменив считывание файла на readfile
Оставить комментарий
Имя или ник:
Комментарий: