Просмотр файла lib/includes/articles/upload.php

Размер файла: 15.1Kb
  1. <?php
  2.  
  3. if ($id)
  4. {
  5.  
  6. $cat = $sql->query("SELECT `name`, `mod` FROM `mod_lib` WHERE `type` = 'cat' AND `id` = " . $id )->fetch();
  7. if ($cat === FALSE)
  8. {
  9.  
  10. unset($cat);
  11.  
  12. }
  13.  
  14. }
  15. else
  16. {
  17.  
  18. $id = 0;
  19.  
  20. }
  21.  
  22. $access = FALSE;
  23. if ($user_id && isset($cat) && $cat['mod'] == 1)
  24. {
  25.  
  26. $access = TRUE;
  27.  
  28. }
  29. elseif ($admin)
  30. {
  31.  
  32. $access = TRUE;
  33.  
  34. }
  35.  
  36. if ($access === TRUE)
  37. {
  38. Core::get('text.class', 'classes');
  39. $max_size = include H . 'engine/includes/max_file_size.php';
  40. if (!empty($_POST))
  41. {
  42.  
  43. if (!empty($_FILES))
  44. {
  45.  
  46. $error = array();
  47.  
  48. /* Проверка размера файла */
  49. if ($_FILES['file']['size'] > $max_size)
  50. {
  51.  
  52. $error[] = 'Размер файла не должен превышать &#160;' . text::size_data($max_size);
  53.  
  54. }
  55.  
  56. /* Проверка имени файла */
  57. $fname = $_FILES['file']['name'];
  58.  
  59. if (preg_match("/[^\A-z0-9_\-.]+/", $fname))
  60. {
  61.  
  62. $error[] = 'В имени файла присутствуют недопустимые символы';
  63.  
  64. }
  65.  
  66. $ext = pathinfo($fname, PATHINFO_EXTENSION);
  67.  
  68. if (($ext == 'txt' || $ext == 'zip') && empty($error))
  69. {
  70.  
  71. $path = FILESDIR . 'upload' . DIRECTORY_SEPARATOR . '.' . $ext;
  72.  
  73. if (file_exists($path))
  74. {
  75.  
  76. $path = FILESDIR . 'upload' . DIRECTORY_SEPARATOR . 'copy_' . '_' . time() . '.' . $ext;
  77.  
  78. }
  79.  
  80. if (copy($_FILES['file']['tmp_name'], $path) === TRUE)
  81. {
  82.  
  83. switch ($ext)
  84. {
  85.  
  86. case 'txt':
  87. $file = fopen($path,'r');
  88. $text = fread($file, filesize($path));
  89. if (isset($_POST['winencode']))
  90. {
  91. $text = @iconv('windows-1251', 'UTF-8', $text);
  92. }
  93. fclose($file);
  94. unlink($path);
  95. echo '<div class="fmenu">' . 'Библиотека' . ' | Загрузка статей</div>' .
  96. '<div class="menu">Файл загружен' .
  97. '<br /><form action="?act=articles&amp;mod=form&amp;id=' . $id . '&amp;do=add" method="post">' .
  98. '<input type="hidden" name="text" value="' . htmlspecialchars(iconv('UTF-8', 'UTF-8//IGNORE', $text)) . '" />' . // вырезаем беспонтовые символы
  99. '<input type="submit" name="addarc" value="Продолжить" /></form></div>' .
  100. '<div class="fmenu"><a href="?act=category&amp;mod=view&amp;id=' . $id . '">Назад</a></div>';
  101. break;
  102. case 'zip': // Не ставить break;
  103. default:
  104. Core::get('zip', 'classes');
  105. $zip = new PclZip($path);
  106. if (($contents = $zip->listcontent()) == FALSE)
  107. {
  108.  
  109. $error = 'Ошибка принятых данных';
  110.  
  111. }
  112. else
  113. {
  114.  
  115. if (count($contents) > $libSet['zip_deal'])
  116. {
  117.  
  118. $error = 'Кол-во файлов в архиве не должно превышать &#160;' . $libSet['zip_deal'];
  119.  
  120. }
  121. else
  122. {
  123.  
  124. echo '<div class="fmenu">' . 'Библиотека' . ' | Загрузка статей</div>' .
  125. '<div class="msg">Обязательные поля помечены звездочкой. <span class="red">*</span></div>' .
  126. '<form action="?act=articles&amp;mod=upload&amp;id=' . $id . '" method="post" name="form">';
  127.  
  128. $i = 0;
  129. foreach ($contents as $files)
  130. {
  131.  
  132. echo '<div class="' . ($i % 2 ? 'p_m' : 'p_t') . '"><b>Имя файла</b>: ' . htmlentities($files['filename'], ENT_QUOTES, 'UTF-8') . '<br />';
  133.  
  134. if ( $files['folder'] == FALSE && mb_substr_count($files['filename'], '/') == 0 )
  135. {
  136.  
  137. $file = $zip->extract(PCLZIP_OPT_BY_INDEX, $files['index'],PCLZIP_OPT_EXTRACT_AS_STRING);
  138. $file = $file[0];
  139. if ($file['size'] > 16777215)
  140. {
  141.  
  142. echo 'Ошибка: Превышена допустимая длина заголовка<br />';
  143.  
  144. }
  145. elseif(mb_substr_count($file['filename'], '.txt') == 1)
  146. {
  147.  
  148. if (isset($_POST['winencode']))
  149. {
  150. $file['content'] = @iconv('windows-1251', 'UTF-8', $file['content']);
  151. }
  152. echo '<span class="red">*</span> Заголовок'.
  153. ':<br /><input type="text" name="arc[' . $i . '][title]" /><br />' .
  154. '<span class="red">*</span> Анонс' .
  155. ':<br /><input type="text" name="arc[' . $i . '][announce]" /><br />' .
  156. '<span class="red">*</span> Текст' .
  157. ':<br /><textarea rows="10" name="arc[' . $i . '][text]">' .
  158. htmlentities($file['content'], ENT_QUOTES, 'UTF-8') .
  159. '</textarea><br />Метки:<br />' .
  160. '<input type="text" name="arc[' . $i . '][tags]" />' .
  161. '<input type="hidden" name="arc[' . $i . '][filename]" value="' .
  162. htmlentities($files['filename'], ENT_QUOTES, 'UTF-8') . '" />';
  163.  
  164. }
  165. else
  166. {
  167.  
  168. echo 'Ошибка: Недопустимое расширение файла. Файл дожен иметь расширение txt<br />';
  169.  
  170. }
  171.  
  172. }
  173.  
  174. echo '</div>';
  175. $i++;
  176.  
  177. }
  178.  
  179. echo '<div class="msg"><input type="submit" name="submit" value="Добавить" /></div></form>' .
  180. '<div class="fmenu"><a href="?act=category&amp;mod=view&amp;id=' . $id . '">Назад</a></div>';
  181.  
  182. }
  183.  
  184. }
  185. unset($zip);
  186. unlink($path);
  187. break;
  188.  
  189. }
  190.  
  191. }
  192. else
  193. {
  194.  
  195. $error = 'При загрузке файла произошла ошибка';
  196.  
  197. }
  198.  
  199. }
  200. else
  201. {
  202.  
  203. $error[] = 'К отправке разрешены файлы имеющие одно из следущих расширений. &#160;zip, txt.';
  204.  
  205. }
  206.  
  207.  
  208.  
  209.  
  210. }
  211. elseif(isset($_POST['submit']))
  212. {
  213.  
  214. if (!empty($_POST['arc']))
  215. {
  216.  
  217. $sql2 = "INSERT INTO `mod_lib` (`refid`, `name`, `announce`, `text`, `tags`, `type`, `author_id`, `author_name`, `mod`, `time`) VALUES ";
  218. $i = 0;
  219. $total = count($_POST['arc']);
  220. $mod = $moder > 0 ? 0 : 1;
  221. $err = array();
  222.  
  223. foreach($_POST['arc'] as $arc)
  224. {
  225.  
  226. $filename = !empty($arc['filename']) ? htmlentities($arc['filename'], ENT_QUOTES, 'UTF-8') : $i;
  227.  
  228. if (empty($arc['title']))
  229. {
  230.  
  231. $err[$filename][] = 'Вы не ввели название';
  232.  
  233. }
  234. else
  235. {
  236.  
  237. $title = my_esc($arc['title']);
  238.  
  239. if (mb_strlen($title) > 255)
  240. {
  241.  
  242. $err[$filename][] = 'Превышена допустимая длина заголовка.';
  243.  
  244. }
  245.  
  246. $total_title = intval($sql->query("SELECT COUNT(*) FROM `mod_lib` WHERE `refid` = '" . $id . "' AND `name` = '" . $title . "' AND `type` = 'arc'")->result());
  247.  
  248. if ($total_title > 0)
  249. {
  250.  
  251. $err[$filename][] = 'Статья с таким названием уже есть';
  252.  
  253. }
  254.  
  255. }
  256.  
  257. if (!empty($arc['announce']))
  258. {
  259.  
  260. $announce = my_esc($arc['announce']);
  261. if (mb_strlen($announce) > 255)
  262. {
  263.  
  264. $err[$filename][] = 'Недопустимая длина анонса';
  265.  
  266. }
  267.  
  268. }
  269. else
  270. {
  271.  
  272. $err[$filename][] = 'Вы не ввели анонс';
  273.  
  274. }
  275.  
  276. if (!empty($arc['text']))
  277. {
  278.  
  279. $text = my_esc($arc['text']);
  280. if (mb_strlen($text) > 65534)
  281. {
  282.  
  283. $err[$filename][] = 'Превышена допустимая длина текста';
  284.  
  285. }
  286.  
  287. }
  288. else
  289. {
  290.  
  291. $err[$filename][] = 'Вы не ввели текст';
  292.  
  293. }
  294.  
  295. if (!empty($arc['tags']))
  296. {
  297.  
  298. $tags = explode(',', $arc['tags']);
  299. $tags = array_map('trim', $tags);
  300. $tags = my_esc(implode(',', $tags));
  301. if (strlen($tags) > 255)
  302. {
  303.  
  304. $err[$filename][] = 'Превышена допустимая длина меток';
  305.  
  306. }
  307.  
  308. }
  309. else
  310. {
  311.  
  312. $tags = '';
  313.  
  314. }
  315.  
  316. if (empty($err))
  317. {
  318.  
  319. $sql_do = TRUE;
  320. $sql2 .= "('" . $id . "', '" . $title . "', '" . $announce .
  321. "', '" . $text . "', '" . $tags . "', 'arc', '" . $user_id .
  322. "', '" . $user['nick'] . "', '" . $mod . "', '" . time() .
  323. "')" . ( ($i == ($total - 1)) ? ";" : "," ) . PHP_EOL;
  324. unset($_POST['arc'][$i]);
  325.  
  326. }
  327.  
  328. $i++;
  329.  
  330. }
  331.  
  332. $message = '';
  333.  
  334. if (isset($sql_do))
  335. {
  336.  
  337. $sql->query($sql2);
  338. $message = 'Статьи добавлены &#160;<a href="?act=category&amp;mod=view&amp;id=' . $id . '">Продолжить</a>';
  339.  
  340. }
  341.  
  342. if (!empty($err))
  343. {
  344.  
  345. $message .= '<br />' . lng('err_zip_arcs_add') . ':';
  346.  
  347. foreach ($err as $aid => $mess)
  348. {
  349.  
  350. $message .= '<br />' . $aid . ': ' . implode(' ', $mess);
  351.  
  352. }
  353.  
  354. $message .= '<br />Попробуйте еще раз.';
  355.  
  356. }
  357.  
  358. echo '<div class="fmenu">' . 'Библиотека' . ' | Загрузка статей</div>' .
  359. '<div class="msg">' . $message . '<br /><a href="?act=articles&amp;mod=upload&amp;id=' . $id . '">Повторить' .
  360. '</a> | <a href="index.php">В библиотеку</a></div>' .
  361. '<div class="fmenu"><a href="?act=category&amp;mod=view&amp;id=' . $id . '">Назад</a></div>';
  362.  
  363. }
  364. else
  365. {
  366.  
  367. $error = 'Ошибка принятых данных';
  368.  
  369. }
  370.  
  371. }
  372. else
  373. {
  374.  
  375. $error = 'Вы не выбрали файл';
  376.  
  377. }
  378.  
  379. }
  380. else
  381. {
  382.  
  383. echo '<div class="fmenu">' . 'Библиотека' . ' | Загрузка статей </div><div class="msg">' .
  384. 'Для загрузки разрешены файлы с расширениями zip или txt. <br />Zip файл должен содержать только текстовые файлы с расширением txt в количестве не более &#160;' . $libSet['zip_deal'] . '.</div><div class="post">' .
  385. '<form action="?act=articles&amp;mod=upload&amp;id=' . $id . '" method="post" enctype="multipart/form-data">' .
  386. 'Выберите файл:<br /><input type="file" name="file" /><br />' .
  387. '<input type="checkbox" checked="checked" name="winencode" value="1" /> Win-1251<br />' .
  388. '<input type="submit" name="submit" value="Загрузить" /></form></div>' .
  389. '<div class="fmenu"><a href="?act=category&amp;mod=view&amp;id=' . $id . '">Назад</a></div>';
  390.  
  391. }
  392.  
  393. }
  394. else
  395. {
  396.  
  397. $error = 'Доступ запрещен';
  398.  
  399. }
  400.  
  401. if (!empty($error))
  402. {
  403.  
  404. $error = is_array($error) ? implode('<br />', $error) : $error;
  405. $error .= '<br /><a href="?act=articles&amp;mod=upload&amp;id=' . $id . '">Продолжить' .
  406. '</a> | <a href="index.php">В библиотеку</a>';
  407.  
  408. }