Консультация № 186793
09.11.2012, 21:40
78.70 руб.
0 12 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
на странице сайта идёт раздача документов в формате Ворд
эти файлы я вручную закидываю на хост, те кто по умнее хотели бы эти документы скачивать в заархированом виде, так вот, чтобы мне этим не парится мне можно архивацию возложить на сервер?
или это я загнул? если можно то как?
код напишите, спасибо

Обсуждение

давно
Старший Модератор
312929
1973
10.11.2012, 15:32
общий
это ответ
Здравствуйте, Ципихович Эндрю!

Вот пример кода:
[code lang=html]<html>
<head>
<title>Архивация файла</title>
</head>
<body>
<?php
if (isset($_FILES['file']) AND $_FILES['file']['error']==0)
{
$zip_archive = new ZipArchive();
$zip_file_name = substr_replace($_FILES['file']['name'], '.zip', strrpos($_FILES['file']['name'],'.'));
if ($zip_archive -> open(getcwd()."/$zip_file_name", ZIPARCHIVE::CREATE) == TRUE)
{
$zip_archive -> addFile($_FILES['file']['tmp_name'], $_FILES['file']['name']);
$zip_archive -> close();
echo "<a href='$zip_file_name'>Ссылка для загрузки архива</a>";
}
else echo "<div>Архив не может быть создан</div>";
}
else echo "
<form method=post enctype='multipart/form-data'>
<div>Выберите файл: <input type=file name='file'> <input type=submit value='Отправить'> </div>
</form>";
?>
</body>
</html>[/code]
Он загружает исходный файл на хостинг и сразу создаёт архив, используя класс ZipArchive. Сперва создаётся объект:
[code lang=php]$zip_archive = new ZipArchive()[/code]

Потом открывается новый zip-архив:
[code lang=php]$zip_archive -> open(getcwd()."/$zip_file_name", ZIPARCHIVE::CREATE)[/code]
Первый параметр метода open - имя архива с полным путём (здесь оно получается из имени исходного файла заменой расширения на .zip и добавлением пути текущего каталога, Вы можете использовать для хранения архивов какой-то другой каталог и выбирать любое имя). Второй параметр - режим открытия (ZIPARCHIVE::CREATE означает создание нового архива). Возвращается TRUE, если архив успешно создан.

Затем к архиву добавляется файл (это можно повторить несколько раз):
[code lang=php]$zip_archive -> addFile($_FILES['file']['tmp_name'], $_FILES['file']['name'])[/code]
Первый параметр метода addFile - имя добавляемого файла с полным путём (здесь это временный файл, созданный при загрузке через форму, Вы можете указать любое нужное имя), второй - имя файла внутри архива (если его не указывать, файл запишется в архив под своим именем вместе с полным путём). Возвращается TRUE, если файл успешно добавлен.

В конце закрывается созданный архив с сохранением всех добавлений:
[code lang=php]$zip_archive -> close();[/code]

Проверить работу этого скрипта можно по ссылке.
Неизвестный
11.11.2012, 18:11
общий
спасибо, хоть и есть возможность проверки, сорри в командировке нахожусь, инет слабый, по приезду проверю, что не ясно спрошу
Неизвестный
17.11.2012, 23:44
общий
добрался до приемлемых условий, стал проверять
Код:

<html>
<head>
<title>Архивация файла</title>
</head>
<body>
<?php
'file'
//file archiving - файл для архивирования, в php вместо пробелов не нужно указывать "%20"
$file_archiving ='Правила дорожного движения РФ.doc';
//file in archive - файл в архиве, в php вместо пробелов не нужно указывать "%20"
$file_in_archive ='Правила дорожного движения РФ.zip';
//isset — определяет, была ли установлена переменная значением отличным от NULL
if (isset($_FILES[$file_in_archive]) AND $_FILES[$file_in_archive]['error']==0)
{
//создаётся объект
$zip_archive = new ZipArchive();
$zip_file_name = substr_replace($_FILES[$file_in_archive]['name'], '.zip', strrpos($_FILES[$file_in_archive]['name'],'.'));
//$zip_archive -> open(getcwd()."/$zip_file_name", ZIPARCHIVE::CREATE) - открывается новый zip-архив
if ($zip_archive -> open(getcwd()."/$zip_file_name", ZIPARCHIVE::CREATE) == TRUE)
{
//затем к архиву добавляется файл (это можно повторить несколько раз)
$zip_archive -> addFile($_FILES[$file_in_archive]['tmp_name'], $_FILES[$file_in_archive]['name']);
//закрывается созданный архив с сохранением всех добавлений
$zip_archive -> close();
echo "<a href='$zip_file_name'>Ссылка для загрузки архива</a>";
}
else echo "<div>Архив не может быть создан</div>";
}
else echo "
<form method=post enctype='multipart/form-data'>
<div>Выберите файл: <input type=file name=$file_in_archive> <input type=submit value='Отправить'> </div>
</form>";
?>
</body>
</html>

получил - Ошибка сервера, что нужно исправить??
Неизвестный
18.11.2012, 06:21
общий
в посте выше речь шла когда индексный файл в корне сайта имел расширение php, а когда имеет расширение html тогда картина на странице следующая
open(getcwd()."/$zip_file_name", ZIPARCHIVE::CREATE) - открывается новый zip-архив if ($zip_archive -> open(getcwd()."/$zip_file_name", ZIPARCHIVE::CREATE) == TRUE) { //затем к архиву добавляется файл (это можно повторить несколько раз) $zip_archive -> addFile($_FILES[$file_in_archive]['tmp_name'], $_FILES[$file_in_archive]['name']); //закрывается созданный архив с сохранением всех добавлений $zip_archive -> close(); echo "Ссылка для загрузки архива"; } else echo "
Архив не может быть создан
"; } else echo "
Выберите файл:
давно
Старший Модератор
312929
1973
21.11.2012, 19:25
общий
21.11.2012, 19:27
Поскольку используется php-код, то файл должен иметь расширение .php (если только у вас в настройках сервера не указано обрабатывать html-файлы как php.

Код под Вашу конкретную ситуацию можно переделать так:
[code lang=html]<html>
<head>
<title>Архивация файла</title>
</head>
<body>
<?php
$file_archiving ='Правила дорожного движения РФ.doc';
$file_in_archive ='Правила дорожного движения РФ.zip';
if (isset($file_archiving))
{
$zip_archive = new ZipArchive();
if ($zip_archive -> open(getcwd()."/$file_in_archive", ZIPARCHIVE::CREATE) == TRUE)
{
$zip_archive -> addFile($file_archiving, $file_archiving);
$zip_archive -> close();
echo "<a href='$file_in_archive'>Ссылка для загрузки архива</a>";
}
else echo "<div>Архив не может быть создан</div>";
}
else echo "
<form method=post enctype='multipart/form-data'>
<div>Выберите файл: <input type=file name='file'> <input type=submit value='Отправить'> </div>
</form>";
?>
</body>
</html>[/code]
Массив $_FILES здесь не нужен - поскольку имя архивируемого файла указано непосредственно в тексте скрипта, а не передаётся ему через форму.
Неизвестный
24.11.2012, 17:52
общий
Адресаты:
я извиняюсь за тягомотину, так как в командировке и в приемлемых условиях бываю по выходным
итак, что я имею в корне сайта файл index.php с кодом указанным в сообщении № 4
что я вижу заходя на сайт: Ссылка для загрузки архива
нажав на неё я имею
Not Found

The requested URL /Правила дорожного движения РФ.zip was not found on this server.
и файл Правила дорожного движения РФ.doc в заархивированном виде в корне сайта не появляется, а по задумке должен быть, что я делаю не так?
давно
Старший Модератор
312929
1973
29.11.2012, 09:56
общий
А файл index.php у Вас в какой кодировке набран? Подозреваю, что в UTF-8, а имена файлов должны быть в КОИ или в Windows-1251 (если они на русском языке, это существенно). Попробуйте для начала использовать в имени файла только латинские буквы, если всё пройдёт нормально, значит дело в кодировке.
Неизвестный
29.11.2012, 10:59
общий
попробую отпишусь
Неизвестный
01.12.2012, 20:55
общий
ну сделал так
$file_archiving ='2.doc';
$file_in_archive ='2.zip';
всё работает, понятно в чём проблема, но файла 2.zip в корне сайта нет, откуда он берётся для скачки, или его не должно быть??????????
Неизвестный
01.12.2012, 21:14
общий
Адресаты:
ошибочка вышла есть этот файл в корне, а так с русскими буквами на могу сделать...
$file_archiving ='ф2.doc';
$file_in_archive ='ф2.zip';
Неизвестный
01.12.2012, 21:43
общий
вот я балда тотал обновлять нужно перед просмотром, осталось избавиться от ссылки такого вида: Ссылка для загрузки архива как? я менял кодировку на windows-1251
Неизвестный
02.12.2012, 05:28
общий
сделать - сделал, но удовлетворения от того, чтобы было по человечески пробелы нужно заменить на _, а кириллицу латиницей в имени файла не получил, всем спасибо
Форма ответа