[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: краказябры в zip архиве
alavasters
Народ есть проблема.
Сделал небольшой хостинг файлов для пользователей. Так вот сделал возможность архивирования нескольких файлов в один 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;

Спустя 52 секунды (2.03.2011 - 10:58) Snus написал(а):
alavasters
Да, действительно косяк имеется smile.gif Ищи другу библиотеку для работы с Zip или переименовывай архивируемые файлы smile.gif

Спустя 3 минуты, 57 секунд (2.03.2011 - 11:02) alavasters написал(а):
Да искал, так что то ничего и не нашел. Может подскажешь
Кстати а не знаешь, как можно например переименовывать имена файлов с русского например в транслит? Или для этого нужно функцию писать особую?

Спустя 4 минуты, 51 секунда (2.03.2011 - 11:07) Snus написал(а):
alavasters
Такой функции вроде нет (могу ошибаться) , ее легко можно ручками написать.

А так совет на будущее - делай так.
Создавай таблицу в БД
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()

Скрипт ведь у тебя в юникоде?

Спустя 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)
А если не в юникоде, то попробуй в него конвертировать имя файла. Хрен его знает, с какой кодировкой там этот класс работает... )
Цитата
У меня и так cp1251 используется. Так как сервак на cp1251 и у всех клиентов cp1251

да, кстати попробуй, вдруг получится

Попробовал не помогает тоже самое

Спустя 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);
и будет счастье.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.