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

Форум PHP

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

 

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

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

тема: сохранение графики с сервера на локальную машину
 
 автор: webwizard   (24.11.2007 в 08:19)   письмо автору
 
 

Здравствуйте.

Помогите, пожалуйста, решить следующую проблему:

есть ссылка такого вида:


<a href=load.php?file=".$pag['name'].">Скачать</a>

где $pag['name'] - это имя графического файла, которое храниться в базе данных, ну к пирему вид ссылки может быть катим:

<a href=upload/load.php?filee=pic1.PNG>Скачать</a>
<a href=upload/load.php?filee=слон.GIF>Скачать</a>
<a href=upload/load.php?filee=tree.jpg>Скачать</a>

В файле load.php есть следующий обработчик:


if (isset($_GET['file']))
   {

     $fileCType = 'application/octet-stream';
     $file_extension = strtolower(substr(strrchr($_GET['file'], '.'), 1));
     $CTypes = array
     (
     'pdf' => 'application/pdf',
     'exe' => 'application/octet-stream',
     'zip' => 'application/x-zip-compressed',
     'rar' => 'application/x-rar-compressed',
     'doc' => 'application/msword',
     'xls' => 'application/vnd.ms-excel',
     'ppt' => 'application/vnd.ms-powerpoint',
     'gif' => 'image/gif',
     'png' => 'image/png',
     'jpe' => 'jpeg',
     'jpg' => 'image/jpg'
     );

         if(isset($CTypes[$file_extension]))
                  $fileCType = $CTypes[$file_extension];

    $file = "uploads/picture/".$_GET['file'];
    header("Content-Disposition: attachment; filename=".$_GET['file']);
    header("Content-Length: ".filesize($file));
    header("Content-type: $fileCType; name=".$_GET['file']);
    echo file_get_contents($file);
  }


При этом возникает окно, предлагающее сохранить графический файл на машину клиента, но есть несколько проблем:

во-первых, при нажатии на кнопку открыть появляется окно с пустой картинкой, путь которой такой:

http://localhost/upload/load.php?file=tree.jpg
а должен быть совсем другой путь:
http://localhost/upload/uploads/picture/tree.jpg?
Как это получить? Помогите, пожалуйста.

во-вторых, при нажатии на кнопку сохранить, файл скачивается на клиентскую машину полностью, т.е если размер равен, к примеру 300 Кb, то и на клиентской машине он соответствует правильному размеру, но проблема в том, что jpg-файлы открываются нормально, а gif-файлы и png-файлы открываются пустыми (без изображения, хотя размер файла нормальный не нулевой)

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

Заранее большое Вам спасибо

   
 
 автор: sim5   (24.11.2007 в 12:41)   письмо автору
 
   для: webwizard   (24.11.2007 в 08:19)
 


<?
$file 
"file.gif";
header("Content-Disposition: attachment; filename=".$file);
header("Content-Length: ".filesize($file));
header("Content-type: image/gif; name=".$file);
echo 
file_get_contents($file);
?>

И все работает, может все таки заголовки не верные формируются?

PS. Вообще же должно отправляться без проблем и просто так:

<?
$file 
"path/image.ext";
$name "image.ext";
header("Content-Disposition: attachment; filename=".$name);
header("Content-Length: ".filesize($file)); 
header("Content-type: ".$file);
echo 
file_get_contents($file);
?>

   
 
 автор: webwizard   (24.11.2007 в 14:52)   письмо автору
 
   для: sim5   (24.11.2007 в 12:41)
 

Спасибо большое, за ответ, я попробовал второй вариант (первый вообще не работает, почему?):



<? 
$file 
"path/image.ext"
$name "image.ext"
header("Content-Disposition: attachment; filename=".$name); 
header("Content-Length: ".filesize($file));  
header("Content-type: ".$file); 
echo 
file_get_contents($file); 
?>



Вот как это выглядит у меня:



    $file = "uploads/picture/".$_GET['file'];
    $name = $_GET['file'];
    header("Content-Disposition: attachment; filename=".$name);
    header("Content-Length: ".filesize($file));
    header("Content-type: ".$file);
    echo file_get_contents($file);


И опять проблема с открытием файлов gif и png! Размер точный, а изображения нет!!
Почему так, как это устранить?
Пожалуйста, помогите.

   
 
 автор: sim5   (24.11.2007 в 15:15)   письмо автору
 
   для: webwizard   (24.11.2007 в 14:52)
 

И так:

<?
$file 
"uploads/picture/".$_GET['file']; 
$name $_GET['file']; 
header("Content-Disposition: attachment; filename=".$name); 
header("Content-Length: ".filesize($file)); 
header("Content-type: ".$file); 
echo 
file_get_contents($file);
?>

локально работает. Вообще лучше так trim($_GET['file']). Просмотрите содержимое полученного, можно в текстовом виде, чтобы выяснить, что вы получаете в конечном итоге.

   
 
 автор: Trianon   (24.11.2007 в 16:49)   письмо автору
 
   для: sim5   (24.11.2007 в 15:15)
 

Content-Type, всё ж, должен быть типом...

   
 
 автор: sim5   (24.11.2007 в 16:54)   письмо автору
 
   для: Trianon   (24.11.2007 в 16:49)
 

Должен, но примет и так, проверено с реального хоста :) Видимо, я предпологаю, что контент не тот, который ожидается, приходит. Вот бы это узнать от автора.

   
 
 автор: webwizard   (24.11.2007 в 18:07)   письмо автору
 
   для: sim5   (24.11.2007 в 16:54)
 

Тип определяется верно, в случае с jpg-расширением всё работает отлично, тое сть изображения и закачивается и отображается, а в случае с gif и png-расширениями закачивается всё нормально размер файла соответствует действительности, тип файла тоже верный, но при открытии изображения почему то отсутствует.

Вот уже 3 дня я никак не могу понять почему так,испробовал все возможные аврианты, поэтому надеюсь на Вашу помощь.

   
 
 автор: sim5   (24.11.2007 в 18:54)   письмо автору
 
   для: webwizard   (24.11.2007 в 18:07)
 

А как помочь? Можно предполагать о неисправности, давать советы, а окажется все просто - забыли вилку в розетку вставить :)
Я спокойно получаю GIF изображение, например, прописывая как "научно" так и "вольно" тип в заголовке. Не размер графического файла, и даже не его расширение, опредеяет его содержимое, а его заголовок. Ну посмотрите, что вы получаете, это можно даже в Блокноте проверить. Вы либо загодя высылаете "битый" файл, либо получаете таковым его.
Пока вы не проверете все сами, любой совет вам, буде гаданием на кофейной гуще.

   
 
 автор: webwizard   (25.11.2007 в 06:05)   письмо автору
 
   для: sim5   (24.11.2007 в 18:54)
 

Спасибо за советы и помощь.

Я проверяю в блокноте первая строчка вот такая: GIF89a, а далее идёт всякая символика.

Вот попробуйте, пожалуйста, скачать gif, png и jpg-файлы. Вот адрес ссылки:

http://www.articlesworld.ru/upload/picture.php

Код скрипта, который я использую такой:



if (isset($_GET['file']))
   {

    $file = "uploads/picture/".trim($_GET['file']);
    $name = trim($_GET['file']);
    header("Content-Disposition: attachment; filename=".$name);
    header("Content-Length: ".filesize($file));
    header("Content-type: ".$file);
    echo file_get_contents($file);
   }


Ведь так всё равно не должно быть, у Вас всё работает, а у меня на локалке и на хостинге 1gb.ru ничего не работает, файлы пустые без изображения, я пробовал тип указывать и напрямую:

'gif' => 'image/gif',
'png' => 'image/png',
'jpg' => 'image/jpg'

Получаются повреждённые файлы jpg, а gif и png просто пустые. Почему? Вот мне и нужна помощь.
У меня есть две книги "PHP 5 на примерах" и "PHP 5 практика создания web-сайтов", но к сожалению там этого нет, поэтому я и пришёл на этот форум, чтобы мне помогли справиться с этой задачей.

   
 
 автор: sim5   (25.11.2007 в 07:59)   письмо автору
 
   для: webwizard   (25.11.2007 в 06:05)
 

Пишите по "науке". Вот взято все ваше отдельным тестовым файлом, кроме как с правильным указанием типа и с сокращением, работает как на локалке, так и на удаленном сервере.

<?
if (isset($_GET['file'])) {
  
$name trim($_GET['file']);
  
$file_extension strtolower(substr(strrchr($name'.'), 1)); 
  
$CTypes = array (
    
'gif' => 'image/gif'
    
'png' => 'image/png'
    
'jpg' => 'image/jpg' 
  
);
  
$type $CTypes[$file_extension];
  
$file "testcatalog/".$name;
  
header("Content-Disposition: attachment; filename=".$name);
  
header("Content-Length: ".filesize($file));
  
header("Content-type: ".$type);
  echo 
file_get_contents($file);
}

echo 
'<a href="test.php?file=main.gif">GIF Image</a>
<a href="test.php?file=main.jpg">JPG Image</a>
<a href="test.php?file=main.png">PNG Image</a>'
;

По вашей ссылке файлы приходят "битые", а jpg вообще не грузится.

   
 
 автор: webwizard   (25.11.2007 в 11:20)   письмо автору
 
   для: sim5   (25.11.2007 в 07:59)
 

sim5, огромное спасибо!

Ваш вариант действительно работает (я проверил только на локалке, но думаю, что и на удалённом сервере тоже всё будет нормально)

Но вот почему у меня ссылки приходят битые?

Ведь я считываю название файлов из базы данных! Я не могу писать так как Вы мне посоветовали:


echo '<a href="test.php?file=main.gif">GIF Image</a> 
<a href="test.php?file=main.jpg">JPG Image</a> 
<a href="test.php?file=main.png">PNG Image</a>';


Только так:


echo "<p><a href=?file=".$pag['name'].">Скачать</a>";


$pag['name'] - это и есть название файла, который я передаю через GET.

Подскажите, пожалуйста, как можно избавиться от проблемы передачи битых файлов.

   
 
 автор: sim5   (25.11.2007 в 11:31)   письмо автору
 
   для: webwizard   (25.11.2007 в 11:20)
 

Да собственно говороя, какая разница, пусть они у вас хоть в Блокноте записаны :), в конечном итоге в ссылке все равно будет явно указано имя файла. Перенесите код на реальный сервер и проверьте, должно работать.

   
 
 автор: webwizard   (25.11.2007 в 11:57)   письмо автору
 
   для: sim5   (25.11.2007 в 11:31)
 

Вот в этом весь прикол, я не могу понять, почему на удалённом сервере и на локальном ничего не работает, если передавать значения из базы данных в качестве GET- параметра.

Если указывать напрямую имя файла, как это указали Вы, то всё работает!

Что за фигня?

   
 
 автор: webwizard   (25.11.2007 в 12:08)   письмо автору
 
   для: webwizard   (25.11.2007 в 11:57)
 

ЧУДЕСА. ВОТ сейчас всё заработало.

ОГРОМНОЕ ВАМ СПАСИБО sim5

Вы не поверите, но стоило мне переименовать файл load.php на test.php (Вы так его назвали), то всё получилось. Фантастика. Содержимое файлов load.php и test.php абсолютно идентично, бит в бит :)

Ещё раз огромное ВАМ, sim5, СПАСИБО

   
 
 автор: sim5   (25.11.2007 в 12:13)   письмо автору
 
   для: webwizard   (25.11.2007 в 11:57)
 

Эта фигня как раз и называется вилкой не вставленной в розетку :))
Ну как вижу заработало? GIF-мышка скачивается и проблем нет.

   
 
 автор: mihdan   (25.11.2007 в 13:18)   письмо автору
 
   для: webwizard   (25.11.2007 в 11:57)
 

Не называйте файлы зарезервированными словами (в РНР, mysql, OC, JS) такими как:
com,
count
size - избежите многих глюков при отладке.

   
Rambler's Top100
вверх

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