|
|
|
| Здравствуйте.
Помогите, пожалуйста, решить следующую проблему:
есть ссылка такого вида:
<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-файлы открываются пустыми (без изображения, хотя размер файла нормальный не нулевой)
В чём проблема я понять никак не могу, пробовал использовать всякие заголовки и комбинации, но ничего не выходит. Помогите, пожалуйста, как решить эти проблемы.
Заранее большое Вам спасибо | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: 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! Размер точный, а изображения нет!!
Почему так, как это устранить?
Пожалуйста, помогите. | |
|
|
|
|
|
|
|
для: 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']). Просмотрите содержимое полученного, можно в текстовом виде, чтобы выяснить, что вы получаете в конечном итоге. | |
|
|
|
|
|
|
|
для: sim5
(24.11.2007 в 15:15)
| | Content-Type, всё ж, должен быть типом... | |
|
|
|
|
|
|
|
для: Trianon
(24.11.2007 в 16:49)
| | Должен, но примет и так, проверено с реального хоста :) Видимо, я предпологаю, что контент не тот, который ожидается, приходит. Вот бы это узнать от автора. | |
|
|
|
|
|
|
|
для: sim5
(24.11.2007 в 16:54)
| | Тип определяется верно, в случае с jpg-расширением всё работает отлично, тое сть изображения и закачивается и отображается, а в случае с gif и png-расширениями закачивается всё нормально размер файла соответствует действительности, тип файла тоже верный, но при открытии изображения почему то отсутствует.
Вот уже 3 дня я никак не могу понять почему так,испробовал все возможные аврианты, поэтому надеюсь на Вашу помощь. | |
|
|
|
|
|
|
|
для: webwizard
(24.11.2007 в 18:07)
| | А как помочь? Можно предполагать о неисправности, давать советы, а окажется все просто - забыли вилку в розетку вставить :)
Я спокойно получаю GIF изображение, например, прописывая как "научно" так и "вольно" тип в заголовке. Не размер графического файла, и даже не его расширение, опредеяет его содержимое, а его заголовок. Ну посмотрите, что вы получаете, это можно даже в Блокноте проверить. Вы либо загодя высылаете "битый" файл, либо получаете таковым его.
Пока вы не проверете все сами, любой совет вам, буде гаданием на кофейной гуще. | |
|
|
|
|
|
|
|
для: 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-сайтов", но к сожалению там этого нет, поэтому я и пришёл на этот форум, чтобы мне помогли справиться с этой задачей. | |
|
|
|
|
|
|
|
для: 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 вообще не грузится. | |
|
|
|
|
|
|
|
для: 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.
Подскажите, пожалуйста, как можно избавиться от проблемы передачи битых файлов. | |
|
|
|
|
|
|
|
для: webwizard
(25.11.2007 в 11:20)
| | Да собственно говороя, какая разница, пусть они у вас хоть в Блокноте записаны :), в конечном итоге в ссылке все равно будет явно указано имя файла. Перенесите код на реальный сервер и проверьте, должно работать. | |
|
|
|
|
|
|
|
для: sim5
(25.11.2007 в 11:31)
| | Вот в этом весь прикол, я не могу понять, почему на удалённом сервере и на локальном ничего не работает, если передавать значения из базы данных в качестве GET- параметра.
Если указывать напрямую имя файла, как это указали Вы, то всё работает!
Что за фигня? | |
|
|
|
|
|
|
|
для: webwizard
(25.11.2007 в 11:57)
| | ЧУДЕСА. ВОТ сейчас всё заработало.
ОГРОМНОЕ ВАМ СПАСИБО sim5
Вы не поверите, но стоило мне переименовать файл load.php на test.php (Вы так его назвали), то всё получилось. Фантастика. Содержимое файлов load.php и test.php абсолютно идентично, бит в бит :)
Ещё раз огромное ВАМ, sim5, СПАСИБО | |
|
|
|
|
|
|
|
для: webwizard
(25.11.2007 в 11:57)
| | Эта фигня как раз и называется вилкой не вставленной в розетку :))
Ну как вижу заработало? GIF-мышка скачивается и проблем нет. | |
|
|
|
|
|
|
|
для: webwizard
(25.11.2007 в 11:57)
| | Не называйте файлы зарезервированными словами (в РНР, mysql, OC, JS) такими как:
com,
count
size - избежите многих глюков при отладке. | |
|
|
|
|