Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Переслать текстовик заголовком
 
 автор: Anwor   (24.07.2006 в 11:16)   письмо автору
 
 

Всем привет.
Есть ФТП-шник... бинарные файлы с него отлично скачиваются. Как только речь заходит о текстовиках или 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() используются... а почему не хотите ими воспользоваться?

   
 
 автор: Anwor   (24.07.2006 в 16:10)   письмо автору
 
   для: 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.

   
 
 автор: Anwor   (24.07.2006 в 16:29)   письмо автору
 
   для: 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)
 

Всё правильно, если вы хотите передать пользователю скрипт вы должны ссылаться на страницу, где ничего кроме заголовков и файлов нет - вы по сути при помощи этих заголовков формируете отдельный документ, вроде фотогарфии, который не включать ничего, кроме того, что относится к документу.

   
 
 автор: Anwor   (24.07.2006 в 17:02)   письмо автору
 
   для: 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);
?>

   
 
 автор: Anwor   (24.07.2006 в 17:17)   письмо автору
 
   для: 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($resMYSQL_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$remoteFTP_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 Вы каким браузером качаете?

   
 
 автор: Anwor   (24.07.2006 в 18:02)   письмо автору
 
   для: cheops (из кафе)   (24.07.2006 в 17:20)
 

Explorer'ом.... добавил ехит() после file_get_contents - всё та же ерунда: хочет упорно закачать docs.htm...
Еще кстати один момент. Когда раньше он у меня качал исключительно бинарные файлы заголовком из САБЖа, то перед окошком сохранения обязательно сверху всплывала полоска "защиты"... ее отключаешь, и он всё закачивает. А сейчас, с этими заголовками, защита молчит молчком.... вот и не понятно, в заголовке ли дело...

   
 
 автор: Anwor   (25.07.2006 в 09:52)   письмо автору
 
   для: 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 в 12:00)   письмо автору
 
   для: Anwor   (25.07.2006 в 09:52)
 

Пожалуйста, подскажите!

   
 
 автор: cheops   (25.07.2006 в 15:02)   письмо автору
 
   для: Anwor   (25.07.2006 в 09:52)
 

А почему у вас строка таккая
<?php
  header
("Content-Disposition: attachment; filename".$_GET['path']);
?>

нужен ещё знак равно
<?php
  header
("Content-Disposition: attachment; filename=".$_GET['path']);
?>

   
 
 автор: Anwor   (25.07.2006 в 17:27)   письмо автору
 
   для: cheops   (25.07.2006 в 15:02)
 

Да, извиняюсь, это я уже у себя исправил...
Всё равно та же ерундень. ((( Как же заставить его вспомнить реальное имя файла с расширением??

   
 
 автор: Anwor   (27.07.2006 в 16:36)   письмо автору
 
   для: Anwor   (25.07.2006 в 17:27)
 

Cheops, пожалуйста, помогите мне разобраться с этой ситуацией, единственная препона осталась в сайте, никак не могу понять... заметил еще, что когда пытаюсь скачать с ФТП файл *.php, то он всё равно видит его как htm =( Может, он каким-то образом делает различия между бинарным типом и ASCII?? И почему он так упорно обзывает любой передаваемый файл именем передающего скрипта downfile?....

   
 
 автор: cheops   (27.07.2006 в 22:22)   письмо автору
 
   для: 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']);  
?>

Вообще не должно бы быть такого... это на локальной машине или на сервере хостинга?

   
 
 автор: Anwor   (28.07.2006 в 10:45)   письмо автору
 
   для: 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 в 11:28)   письмо автору
 
   для: Anwor   (28.07.2006 в 10:45)
 

Мда, кроме всего прочего выяснилось, что файлы типа TXT сохраняются как downfile.txt! Вот теперь я окончательно запутался.......

   
 
 автор: cheops   (28.07.2006 в 11:58)   письмо автору
 
   для: 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 в 12:00)   письмо автору
 
   для: cheops   (28.07.2006 в 11:58)
 

Извлечь имя файла из пути можно при помощи функции basename()
<?php 
header
("Content-Disposition: attachment; filename=".basename($_GET['path']));  
?>

   
 
 автор: Anwor   (28.07.2006 в 12:04)   письмо автору
 
   для: cheops   (28.07.2006 в 11:58)
 

Да, у меня там не только имя. Путь примерно такой: "temp/file.pdf"
Спасибо большое! Это уже многое мне дает для "экспериментов" )))
Но если организовать всё как вы говорите, то сам downfile.php должен находиться в одном каталоге со всеми файлами, верно? Как бы мне этого избежать, а то я хотел еще запустить кроновский клинер, который периодически чистил бы каталог "temp/" от оставшихся там файлов... может, можно как-то сделать, чтобы файлу делался unlink прямо после загрузки?..

   
 
 автор: Anwor   (28.07.2006 в 12:05)   письмо автору
 
   для: Anwor   (28.07.2006 в 12:04)
 

Понял насчет basename(), спасибо огромное.... но всё же хотелось бы еще избавиться от файла после его загрузки.. Можно ли после file_get_contents($file) вывести unlink($file)? Не запортит ли это чего?

   
 
 автор: Anwor   (28.07.2006 в 12:27)   письмо автору
 
   для: 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, спасибо Вам большое, вы меня очень, очень, оооочень выручили.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования