|
|
|
| Всем привет.
Есть ФТП-шник... бинарные файлы с него отлично скачиваются. Как только речь заходит о текстовиках или HTM-ках, пытается изобразить их на экране. Знаю, тема поднималась.... в общем, нужен заголовок вида
<?
<HTML><HEAD><META HTTP-EQUIV='Refresh' Content-type='application' CONTENT='1; URL=$path'></HEAD></HTML>
?>
|
(как раз этот заголовок надо бы преобразовать)
Внимание: НЕ вида header(.......)!
Объясните, пожалуйста. | |
|
|
|
|
автор: cheops (из кафе) (24.07.2006 в 16:07) |
|
|
для: Anwor
(24.07.2006 в 11:16)
| | Здесь как раз вида header() используются... а почему не хотите ими воспользоваться? | |
|
|
|
|
|
|
|
для: cheops (из кафе)
(24.07.2006 в 16:07)
| | Я уже пересмотрел ситуацию... )))) Жду варианта header()! ))))) | |
|
|
|
|
автор: cheops (из кафе) (24.07.2006 в 16:16) |
|
|
для: Anwor
(24.07.2006 в 16:10)
| | Тогда вас возможно заинтересует тема по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=10439. | |
|
|
|
|
|
|
|
для: cheops (из кафе)
(24.07.2006 в 16:16)
| | Эээээээ...
Использую заголовки
header("Content-Disposition: attachment; filename=$path");
header("Content-type: application/octet-stream");
|
но вместо искомого файла загружается на ХДД сама ХТМЛ-страница (сгенерированная скриптом). В чем же дело? | |
|
|
|
|
автор: cheops (из кафе) (24.07.2006 в 16:56) |
|
|
для: Anwor
(24.07.2006 в 16:29)
| | Всё правильно, если вы хотите передать пользователю скрипт вы должны ссылаться на страницу, где ничего кроме заголовков и файлов нет - вы по сути при помощи этих заголовков формируете отдельный документ, вроде фотогарфии, который не включать ничего, кроме того, что относится к документу. | |
|
|
|
|
|
|
|
для: cheops (из кафе)
(24.07.2006 в 16:56)
| | Да, но я-то хочу передать не скрипт, а файл, и переменная $path напрямую указывает именно на файл... | |
|
|
|
|
автор: cheops (из кафе) (24.07.2006 в 17:06) |
|
|
для: Anwor
(24.07.2006 в 17:02)
| | После заголовков должно следовать содержимое файла и больше ничего не должно быть, иначе испортите структуру файла. У вас так?
<?php
header("Content-Disposition: attachment; filename=$path");
header("Content-type: application/octet-stream");
echo file_get_contents($path);
?>
|
| |
|
|
|
|
|
|
|
для: cheops (из кафе)
(24.07.2006 в 17:06)
| | Мммм.. наверное, я жутко туплю... и извиняюсь за это... но вот мой скрипт:
<?php
if ($_GET['act']=='downfile') {
if ($_GET['confirm']==1) {
//если подтверждено скачивание
$res=mysql_query("select path, name from file where id=".$_GET['id']);
$row=mysql_fetch_array($res, MYSQL_ASSOC);
$dir=$row['path'];
$direct = str_replace('%', '/', $dir);
$path_parts=pathinfo($direct);
$ext=$path_parts["extension"];
$path = "temp/".time().".$ext";
require_once("ftp.php");
$local=$path;
$remote=$direct;
$ret = ftp_nb_get($link, $local, $remote, FTP_BINARY);
while ($ret == FTP_MOREDATA) {
$ret = ftp_nb_continue($link);
}
if ($ret != FTP_FINISHED)
{
echo "<br><font color='red'><b>Ошибка загрузки!</b></font>";
exit();
}
header("Content-Disposition: attachment; filename=$path");
header("Content-type: application/octet-stream");
echo file_get_contents($path);
}
echo "<h4>Скачивание файла на жесткий диск</h4>
<p><b>Вы действительно хотите загрузить эту версию файла на жесткий диск?</b></p>
<form action='docs.php?act=downfile&type=".$_GET['type']."&id=".$_GET['id']."&confirm=1' method='post'>
<p><input type='submit' name='download' value='Скачать'></form></p>";
if ($_GET['type']!='first') {
echo "<p><form action='docs.php?act=del&pt=one&id=".$_GET['id']."' method='post'><input type='submit' name='del' value='Удалить данную версию файла'></form></p>";
}
echo "<p><a href='docs.php?path=$path'><< Назад</a></p>";
}
?>
|
При выполнении скрипта вылезает окошко с просьбой сохранить файл docs.html (название скрипта - docs.php). А вы имеете в виду, что после file_get_contents не должно быть ВООБЩЕ НИЧЕГО? Даже exit'а?? | |
|
|
|
|
автор: cheops (из кафе) (24.07.2006 в 17:20) |
|
|
для: Anwor
(24.07.2006 в 17:17)
| | При такой организации скрипта после file_get_contents() как раз exit() нужно добавить, чтобы в конец файла ничего не записывалось...
PS Вы каким браузером качаете? | |
|
|
|
|
|
|
|
для: cheops (из кафе)
(24.07.2006 в 17:20)
| | Explorer'ом.... добавил ехит() после file_get_contents - всё та же ерунда: хочет упорно закачать docs.htm...
Еще кстати один момент. Когда раньше он у меня качал исключительно бинарные файлы заголовком из САБЖа, то перед окошком сохранения обязательно сверху всплывала полоска "защиты"... ее отключаешь, и он всё закачивает. А сейчас, с этими заголовками, защита молчит молчком.... вот и не понятно, в заголовке ли дело... | |
|
|
|
|
|
|
|
для: Anwor
(24.07.2006 в 18:02)
| | Сейчас я немного изменил структуру скрипта, и вынес header'ы в отдельный php-файл. Он совсем небольшой, вот он:
downfile.php
<?php
header("Content-Disposition: attachment; filename".$_GET['path']);
header("Content-type: application/octet-stream");
echo file_get_contents($_GET['path']);
?>
|
Естественно, ему ГЕТом передается сам абсолютный путь к файлу.
Так вот. Теперь картина мира такова: как только пытаемся сохранить ХТМЛ-документ, как бы он ни назывался, сохраняется на ХДД как downfile.htm (по умолчанию). Если же идет какой-то двоичный файл, то мы его принципиально не распознаем, и сохраняем как файл "downfile" без расширения.
Теперь вопрос: меня терзают смутные сомненья, что вслед за этими 2-мя заголовками надо послать еще один, указывающий на конкретное имя файла с расширением. Какой это заголовок? | |
|
|
|
|
|
|
|
для: Anwor
(25.07.2006 в 09:52)
| | Пожалуйста, подскажите! | |
|
|
|
|
|
|
|
для: Anwor
(25.07.2006 в 09:52)
| | А почему у вас строка таккая
<?php
header("Content-Disposition: attachment; filename".$_GET['path']);
?>
|
нужен ещё знак равно
<?php
header("Content-Disposition: attachment; filename=".$_GET['path']);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(25.07.2006 в 15:02)
| | Да, извиняюсь, это я уже у себя исправил...
Всё равно та же ерундень. ((( Как же заставить его вспомнить реальное имя файла с расширением?? | |
|
|
|
|
|
|
|
для: Anwor
(25.07.2006 в 17:27)
| | Cheops, пожалуйста, помогите мне разобраться с этой ситуацией, единственная препона осталась в сайте, никак не могу понять... заметил еще, что когда пытаюсь скачать с ФТП файл *.php, то он всё равно видит его как htm =( Может, он каким-то образом делает различия между бинарным типом и ASCII?? И почему он так упорно обзывает любой передаваемый файл именем передающего скрипта downfile?.... | |
|
|
|
|
|
|
|
для: Anwor
(27.07.2006 в 16:36)
| | Хм... и это в скрипте
<?php
header("Content-Disposition: attachment; filename=".$_GET['path']);
header("Content-type: application/octet-stream");
echo file_get_contents($_GET['path']);
?>
|
Вообще не должно бы быть такого... это на локальной машине или на сервере хостинга? | |
|
|
|
|
|
|
|
для: cheops
(27.07.2006 в 22:22)
| | Это прямо на сервере. Скрипт выглядит именно так, 1 в 1. Вызывается с другой страницы заголовком
<?php
header("location: downfile.php?path=$path");
?>
|
при этом переменная $path на предыдущей странице алертом показывает абсолютно верный путь. Но когда происходит скачивание, то:
1) если файл бинарный и не может быть отображен, то в окошке пишет:
Имя файла: downfile
Тип файла: неизвестный
|
2) если файл может интерпретироваться (html, php, txt и пр.), то окошко такое:
Имя файла: downfile
Тип файла: htm
|
А родное имя с расширением по каким-то причинам не запоминает... ((( | |
|
|
|
|
|
|
|
для: Anwor
(28.07.2006 в 10:45)
| | Мда, кроме всего прочего выяснилось, что файлы типа TXT сохраняются как downfile.txt! Вот теперь я окончательно запутался....... | |
|
|
|
|
|
|
|
для: Anwor
(28.07.2006 в 10:45)
| | Так, погодите, вы в строку
<?php
header("Content-Disposition: attachment; filename=".$_GET['path']);
?>
|
что передаёте? Путь? Это не правильно, здесь должно быть только имя файла, под которым он будет сохраняться у пользователя. Вот так вот правильно
<?php
header("Content-Disposition: attachment; filename=text.txt");
?>
|
а вот так
<?php
header("Content-Disposition: attachment; filename=test/text.txt");
?>
|
уже нет. | |
|
|
|
|
|
|
|
для: cheops
(28.07.2006 в 11:58)
| | Извлечь имя файла из пути можно при помощи функции basename()
<?php
header("Content-Disposition: attachment; filename=".basename($_GET['path']));
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(28.07.2006 в 11:58)
| | Да, у меня там не только имя. Путь примерно такой: "temp/file.pdf"
Спасибо большое! Это уже многое мне дает для "экспериментов" )))
Но если организовать всё как вы говорите, то сам downfile.php должен находиться в одном каталоге со всеми файлами, верно? Как бы мне этого избежать, а то я хотел еще запустить кроновский клинер, который периодически чистил бы каталог "temp/" от оставшихся там файлов... может, можно как-то сделать, чтобы файлу делался unlink прямо после загрузки?.. | |
|
|
|
|
|
|
|
для: Anwor
(28.07.2006 в 12:04)
| | Понял насчет basename(), спасибо огромное.... но всё же хотелось бы еще избавиться от файла после его загрузки.. Можно ли после file_get_contents($file) вывести unlink($file)? Не запортит ли это чего? | |
|
|
|
|
|
|
|
для: Anwor
(28.07.2006 в 12:05)
| | А, всё, я разобрался!! Именно так в конце и выводим (это для потомков )))))))
Итак, полный код скрипта (отлаженный):
<?php
header("Content-Disposition: attachment; filename=".basename($_GET['path']));
header("Content-Type: application/octet-stream");
echo file_get_contents($_GET['path']);
unlink($_GET['path']);
?>
|
Таким образом, файл удаляется сразу, но только после того, как вышло окошко сохранения. Сохраняется правильно. Люди, не повторяйте наших ошибок )))))))
Cheops, спасибо Вам большое, вы меня очень, очень, оооочень выручили. | |
|
|
|