Сделал небольшой хостинг файлов для пользователей. Так вот сделал возможность архивирования нескольких файлов в один zip архив. Проблема вот в чем, если имя файла написано русскими буквами Например: Книга1.xls, то в архиве получается файл с именем ¦эшур1.xls
Для архивации использую такую процедуру:
$zip = new ZipArchive ();
$zip->open("arhive/".$names, ZipArchive::CREATE);
$zip->addFile("up/".$rename[$j], $rename[$j]);
$zip->close();
Если нужны подробности пишите.
Кто сталкивался с такой проблемой
Спустя 11 минут, 55 секунд (2.03.2011 - 10:45) Snus написал(а):
alavasters
Кидани код класса
Кидани код класса
Спустя 2 минуты, 46 секунд (2.03.2011 - 10:48) alavasters написал(а):
На сколько я понял, этот класс стандартный в пхп.
Потому что ничего дополнительного я не писал
Потому что ничего дополнительного я не писал
Спустя 53 секунды (2.03.2011 - 10:49) Snus написал(а):
alavasters
Хм, тогда ща у себя гляну.
Хм, тогда ща у себя гляну.
Спустя 8 минут, 4 секунды (2.03.2011 - 10:57) alavasters написал(а):
Вот смотри:
Есть замечательная библиотека под названием ZipArchive. Вот её-то мы и рассмотрим.
Если у вас версия php меньше, чем 5.2, если у вас появляется ошибка class ziparchive not found, то советую данную библиотеку скачать и установить.
Работа с библиотекой ZipArchive довольно проста. Для начала нужно объявить экземпляр её класса:
$zip = new ZipArchive;
Есть замечательная библиотека под названием ZipArchive. Вот её-то мы и рассмотрим.
Если у вас версия php меньше, чем 5.2, если у вас появляется ошибка class ziparchive not found, то советую данную библиотеку скачать и установить.
Работа с библиотекой ZipArchive довольно проста. Для начала нужно объявить экземпляр её класса:
$zip = new ZipArchive;
Спустя 52 секунды (2.03.2011 - 10:58) Snus написал(а):
alavasters
Да, действительно косяк имеется Ищи другу библиотеку для работы с Zip или переименовывай архивируемые файлы
Да, действительно косяк имеется Ищи другу библиотеку для работы с Zip или переименовывай архивируемые файлы
Спустя 3 минуты, 57 секунд (2.03.2011 - 11:02) alavasters написал(а):
Да искал, так что то ничего и не нашел. Может подскажешь
Кстати а не знаешь, как можно например переименовывать имена файлов с русского например в транслит? Или для этого нужно функцию писать особую?
Кстати а не знаешь, как можно например переименовывать имена файлов с русского например в транслит? Или для этого нужно функцию писать особую?
Спустя 4 минуты, 51 секунда (2.03.2011 - 11:07) Snus написал(а):
alavasters
Такой функции вроде нет (могу ошибаться) , ее легко можно ручками написать.
А так совет на будущее - делай так.
Создавай таблицу в БД
И при архивировании заливай уникальные имена (например микротайм + рандом число или мд5, ша и тд) и в таблицу добавляй запись с путем к этому файлу и его названием.
А когда захочешь распаковать - обращаешься в БД по id, хватаешь filePath (путь до файла), распаковываешь его и даешь имя из fileName
А если хочешь отдавать заголовки с типом файла, то в таблицу еще добавь fileType и пиши туда mime-type
Такой функции вроде нет (могу ошибаться) , ее легко можно ручками написать.
А так совет на будущее - делай так.
Создавай таблицу в БД
id | filePath | fileName
И при архивировании заливай уникальные имена (например микротайм + рандом число или мд5, ша и тд) и в таблицу добавляй запись с путем к этому файлу и его названием.
1 | 229_0.52969700_1278576869_174.pdf.zip | печеньки.pdf
А когда захочешь распаковать - обращаешься в БД по id, хватаешь filePath (путь до файла), распаковываешь его и даешь имя из fileName
А если хочешь отдавать заголовки с типом файла, то в таблицу еще добавь fileType и пиши туда mime-type
Спустя 4 минуты, 38 секунд (2.03.2011 - 11:11) alavasters написал(а):
Спасибо за идею.
Но у меня ситуация другая.
У меня файловый хостинг. Человек выбирает файлы для заливки, нажимает залить, а ему возвращается ссылка на скачивание уже архива
Но у меня ситуация другая.
У меня файловый хостинг. Человек выбирает файлы для заливки, нажимает залить, а ему возвращается ссылка на скачивание уже архива
Спустя 46 секунд (2.03.2011 - 11:12) alavasters написал(а):
Я просто на пхп пишу не так долго может месяц или два.
До этого не программировал вообще. Как правильно писать и что то делать толком не знаю
До этого не программировал вообще. Как правильно писать и что то делать толком не знаю
Спустя 1 минута, 44 секунды (2.03.2011 - 11:14) alavasters написал(а):
Смотри вот код хостинга
Цитата |
<html> <head> <title>111</title> <meta http-equiv="Content-Type" content="text/html; charset=cp1251"> <link rel="stylesheet" type="text/css" media="all" href="style/style.css"> <link rel="icon" type="image/png" href="img/favicon.png" /> </head> <body> <table width="97%" height="100%"><tr valign="center"><td align="center" nowrap><div id="upload"><img src = "img/logo.gif"><br> <br> <br> <?php $locals_link = "http://".$_SERVER ["HTTP_HOST"]; $arhive_dir = "C:/Web_Server/apache/htdocs/Up/"; if ($_POST['file'] == 1) { $usersfilename = $_FILES['upload_file']['name']; $usersfilename_temp = $_FILES['upload_file']['tmp_name']; $usersfile_size = $_FILES['upload_file']['size']; $file_name = basename($usersfilename); $rename = str_replace(' ', '_', $file_name); $link_filename = "http://".$_SERVER ["HTTP_HOST"]."/up/$rename"; if ($usersfile_size<=0) { echo (" Файл $usersfilename пуст !!!"); } if (!@move_uploaded_file($usersfilename_temp,"$arhive_dir/$rename")) { echo ("Невозмождно загрузить файл $usersfilename"); } echo "Ссылка для скачивания: <input type = 'text' readonly size = '60' onclick='this.select()' value = '$link_filename'><BR><a href = '$locals_link'>Загрузить еще.</a>"; } else if ($_POST['file'] == 2) { if ((isset($_POST['arhiv']))) { $kol_files = $_POST['kolichestvo']; $kol_files1 = 0; for ($i=0; $i<$kol_files; $i++) { if ($_FILES['upload_file'.$i]['name'] != '') { $usersfilename[] = $_FILES['upload_file'.$i]['name']; $usersfilename_temp[] = $_FILES['upload_file'.$i]['tmp_name']; $usersfile_size[] = $_FILES['upload_file'.$i]['size']; $file_name[] = basename($usersfilename[$kol_files1]); $rename[] = str_replace(' ', '_', $file_name[$kol_files1]); $kol_files1++; } } $date_today = date("H:i:s_d.m.Y"); $names = md5($date_today).'.zip'; //Генерирует имя zip архива $zip = new ZipArchive (); $zip->open("arhive/".$names, ZipArchive::CREATE); $link_filename = "http://".$_SERVER ["HTTP_HOST"]."/arhive/$names"; for ($j=0; $j<$kol_files1; $j++) { if ($usersfile_size[$j]<=0) { echo ("Файл $usersfilename[$j] пуст !!!"); } if (!@move_uploaded_file($usersfilename_temp[$j],"$arhive_dir/$rename[$j]")) { echo ("Невозмождно загрузить файл $usersfilename[$j]"); } $zip->addFile("up/".$rename[$j], $rename[$j]); } echo "Ссылка для скачивания: <input type = 'text' readonly size = '60' onclick='this.select()' value = '$link_filename'><BR><a href = '$locals_link'>Загрузить еще.</a>"; $zip->close(); } else { $kol_files = $_POST['kolichestvo']; $kol_files1 = 0; for ($i=0; $i<$kol_files; $i++) { if ($_FILES['upload_file'.$i]['name'] != '') { $usersfilename[] = $_FILES['upload_file'.$i]['name']; $usersfilename_temp[] = $_FILES['upload_file'.$i]['tmp_name']; $usersfile_size[] = $_FILES['upload_file'.$i]['size']; $file_name[] = basename($usersfilename[$kol_files1]); $rename[] = str_replace(' ', '_', $file_name[$kol_files1]); $link_filename[] = "http://".$_SERVER ["HTTP_HOST"]."/up/$rename[$kol_files1]"; $kol_files1++; } } for ($j=0; $j<$kol_files1; $j++) { if ($usersfile_size[$j]<=0) { echo ("Файл $usersfilename[$j] пуст !!!"); } if (!@move_uploaded_file($usersfilename_temp[$j],"$arhive_dir/$rename[$j]")) { echo ("Невозмождно загрузить файл $usersfilename[$j]"); } echo ("Ссылка для скачивания: <input type = 'text' readonly size = '60' onclick='this.select()' value = '$link_filename[$j]'><BR><a href = '$locals_link'>Загрузить еще.<>"); } } } ?> </div></td></tr></table></body> </body> </html> |
Спустя 37 секунд (2.03.2011 - 11:15) Invis1ble написал(а):
alavasters
попробуй при указании имени файла переводить его в другую кодировку, например cp1251
iconv()
или
mb_convert_encoding()
Скрипт ведь у тебя в юникоде?
попробуй при указании имени файла переводить его в другую кодировку, например cp1251
iconv()
или
mb_convert_encoding()
Скрипт ведь у тебя в юникоде?
Спустя 1 минута, 52 секунды (2.03.2011 - 11:16) alavasters написал(а):
У меня и так cp1251 используется. Так как сервак на cp1251 и у всех клиентов cp1251
Хотя идея хорошая. Надо будет попробовать
Хотя идея хорошая. Надо будет попробовать
Спустя 49 секунд (2.03.2011 - 11:17) Invis1ble написал(а):
А если не в юникоде, то попробуй в него конвертировать имя файла. Хрен его знает, с какой кодировкой там этот класс работает... )
Цитата |
У меня и так cp1251 используется. Так как сервак на cp1251 и у всех клиентов cp1251 |
да, кстати попробуй, вдруг получится
Спустя 2 минуты, 28 секунд (2.03.2011 - 11:20) Snus написал(а):
<?php
function translit($str){
$translit = array(
'А'=>'A','Б'=>'B','В'=>'V','Г'=>'G',
'Д'=>'D','Е'=>'E','Ж'=>'J','З'=>'Z','И'=>'I',
'Й'=>'Y','К'=>'K','Л'=>'L','М'=>'M','Н'=>'N',
'О'=>'O','П'=>'P','Р'=>'R','С'=>'S','Т'=>'T',
'У'=>'U','Ф'=>'F','Х'=>'H','Ц'=>'TS','Ч'=>'CH',
'Ш'=>'SH','Щ'=>'SCH','Ъ'=>'','Ы'=>'YI','Ь'=>'',
'Э'=>'E','Ю'=>'YU','Я'=>'YA','а'=>'a','б'=>'b',
'в'=>'v','г'=>'g','д'=>'d','е'=>'e','ж'=>'j',
'з'=>'z','и'=>'i','й'=>'y','к'=>'k','л'=>'l',
'м'=>'m','н'=>'n','о'=>'o','п'=>'p','р'=>'r',
'с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>'h',
'ц'=>'ts','ч'=>'ch','ш'=>'sh','щ'=>'sch','ъ'=>'y',
'ы'=>'yi','ь'=>'','э'=>'e','ю'=>'yu','я'=>'ya'
);
return strtr($str,$translit);
}
echo translit('Привет, вася');
?>
Privet, vasya
Спустя 5 минут, 13 секунд (2.03.2011 - 11:25) alavasters написал(а):
О класс, спасибо за функцию
Спустя 5 минут, 10 секунд (2.03.2011 - 11:30) alavasters написал(а):
Цитата (Invis1ble @ 2.03.2011 - 08:17) | ||
А если не в юникоде, то попробуй в него конвертировать имя файла. Хрен его знает, с какой кодировкой там этот класс работает... )
да, кстати попробуй, вдруг получится |
Попробовал не помогает тоже самое
Спустя 2 минуты, 13 секунд (2.03.2011 - 11:32) Invis1ble написал(а):
Значит юзай транслит.
Вывод - не нужно использовать кириллицу в названиях фалов и директорий. Уже сколько проблем из-за это у людей возникало.
Вывод - не нужно использовать кириллицу в названиях фалов и директорий. Уже сколько проблем из-за это у людей возникало.
Спустя 8 минут, 51 секунда (2.03.2011 - 11:41) alavasters написал(а):
Это точно
Спустя 9 минут, 12 секунд (2.03.2011 - 11:50) alavasters написал(а):
Всем спасибо за помощь. Реализовал используя транслитерацию
Спустя 6 месяцев, 6 дней, 22 часа, 57 минут, 31 секунда (9.09.2011 - 09:48) dionis написал(а):
Используйте
$filename=iconv('cp1251','CP866',$filename);
и будет счастье.
$filename=iconv('cp1251','CP866',$filename);
и будет счастье.