Pauk |
Отправлено: 30 мая 2011 — 09:29
|
Advanced Member
Покинул форум
Сообщений всего: 327
Дата рег-ции: Март 2009
Репутация: 6
|
Парни, странная бага началась при закачивании/скачивании архивов... почему то при скачивании архив все время битый, хотя заливаю предварительно архивированный, нормальный файл, но при скачивании он почему то битым становится...
У кого какие есть мысли?
(Добавление)
насколько помню менял однажды файл upload.class.php, но потом действия отменял - может в нем какие строки покоцал:
Мой файл (Отобразить)
CODE:<?php
if (!defined('IN_EXBB')) die('Hack attempt!');
class UPLOAD{
/*
Флаг русской локали boolean
*/
var $_TEMPNAME = '';
var $_NAME = '';
var $_SIZE = '';
var $_TYPE = '';
var $_IMAGE = '';
var $_REQUEST_TYPE = '.*';
var $_TARFILE = FALSE;
function UPLOAD($maxsize) {
$this->_TEMPNAME = $_FILES['FILE_UPLOAD']['tmp_name'];
$this->_NAME = $_FILES['FILE_UPLOAD']['name'];
$this->_SIZE = $_FILES['FILE_UPLOAD']['size'];
$this->_TYPE = $_FILES['FILE_UPLOAD']['type'];
switch ($_FILES['FILE_UPLOAD']['error']) {
case 1: define("UP_ERROR",'Ошибка загрузки файла! Размер файла больше установленного в директиве upload_max_filesize в php.ini');
break;
case 2: define("UP_ERROR",'Ошибка загрузки файла! Размер файла больше разрешенного на форуме!');
break;
case 3: define("UP_ERROR",'Ошибка загрузки файла! Файл загружен только частично!');
break;
case 4: define("UP_NOADDED",TRUE);
break;
default: break;
}
if (!defined("UP_ERROR") && !defined("UP_NOADDED")) {
if ($this->_NAME == "" || $this->_NAME == 'none') {
define("UP_ERROR",'Ошибка загрузки файла! Не указано имя закачиваемого файла!');;
} elseif ($this->_SIZE > $maxsize) {
define("UP_ERROR",'Ошибка загрузки файла! Размер загруженного файла больше, чем разрешено на форуме!');
} elseif ($this->_SIZE == 0) {
define("UP_ERROR",'Ошибка загрузки файла! Размер закачанного файла 0 b!');
}
}
}
function DoUpload($mode,$destination,$storage_name,$max_width = 0,$max_height = 0) {
$this->_IMAGE = @getimagesize($this->_TEMPNAME);
$mode = ($this->_IMAGE !== FALSE && $mode !== 'image') ? 'image':$mode;
if ($mode === 'image') {
if ($this->_IMAGE === FALSE) {
define("UP_ERROR",'Ошибка загрузки файла! Загружаемый файл не является правильным изображением!');
return FALSE;
}
return $this->IMAGE($max_width,$max_height,$destination,$storage_name);
} else {
return $this->FILE($destination,$storage_name);
}
}
function FILE($dest,$storage) {
if (!preg_match("#\.(".$this->_REQUEST_TYPE.")$#is",$this->_NAME)) {
define("UP_ERROR",'Ошибка загрузки файла! Запрещенное расширение файла!');
return FALSE;
}
$storage = $storage.'.ext';
if ($this->_TARFILE === TRUE) {
if (($filetype = $this->_TarAttach($dest.$storage)) === FALSE) {
define("UP_ERROR",'Ошибка загрузки файла! Не могу упаковать файл!');
return FALSE;
}
} else {
if (!move_uploaded_file($this->_TEMPNAME, $dest.$storage)) {
define("UP_ERROR",'Ошибка загрузки файла! Сервер не смог скопировать файл в директорию '.$dest.'. Проверьте права на эту папку!');
return FALSE;
}
$filetype = 'file';
}
return array('NAME' => $this->_NAME,
'STORAGE' => $storage,
'SIZE' => $this->_SIZE,
'TYPE' => $filetype);
}
function IMAGE($_width,$_height,$dest,$storage) {
list($width, $height) = $this->_IMAGE;
if ($width > $_width || $height > $_height) {
define("UP_ERROR",'Ошибка загрузки файла! Ширина или высота закачиваемого изображения больше разрешенных на форуме!');
return FALSE;
}
if (!preg_match('#image\/[x\-]*(jpeg|pjpeg|jpg|gif|png|bmp|tiff)#', $this->_TYPE, $type)) {
define("UP_ERROR",'Ошибка загрузки файла! Запрещенное расширение файла!');
return FALSE;
}
switch ($type[1]) {
case 'jpeg':
case 'pjpeg':
case 'jpg': $ext = '.jpg';
break;
case 'gif': $ext = '.gif';
break;
case 'png': $ext = '.png';
break;
case 'bmp': $ext = '.bmp';
break;
case 'tiff': $ext = '.tiff';
break;
}
$storage = $storage.$ext;
if (!move_uploaded_file($this->_TEMPNAME, $dest.$storage)) {
define("UP_ERROR",'Ошибка загрузки файла! Сервер не смог скопировать файл в директорию '.$dest.'. Проверьте права на эту папку!');
return FALSE;
}
return array('NAME' => $this->_NAME,
'STORAGE' => $storage,
'SIZE' => $this->_SIZE,
'TYPE' => 'image',
'WIDTH' => $width,
'HEIGHT' => $height);
}
function _TarAttach($tarfile) {
$stat = stat($this->_TEMPNAME);
if (!is_array($stat) || !is_file($this->_TEMPNAME) || ($fp = fopen($this->_TEMPNAME, 'rb')) === FALSE) {
//define("UP_ERROR",'Это не массив в результате работы stat');
return FALSE;
}
$data = fread($fp, filesize($this->_TEMPNAME));
fclose($fp);
$files[0] = array ( 'name' => $this->_NAME,
'mode' => fileperms($this->_TEMPNAME),
'uid' => $stat[4],
'gid' => $stat[5],
'size' => strlen($data),
'mtime' => filemtime($this->_TEMPNAME),
'typeflag' => 0,
'linkname' => "",
'uname' => 'unknown',
'gname' => 'unknown',
'data' => $data
);
$uploadtime = date("F j, Y, H:i:s");
$readme = "Upload time: $uploadtime\r\nFile saved from http://".$_SERVER['SERVER_NAME'];
$files[1] = array ( 'name' => "readme.txt",
'mode' => 33152,
'uid' => $stat[4],
'gid' => $stat[5],
'size' => strlen($readme),
'mtime' => time(),
'typeflag' => 0,
'linkname' => "",
'uname' => 'unknown',
'gname' => 'unknown',
'data' => $readme
);
unset($stat);
clearstatcache();
$tardata = "";
foreach ($files as $file) {
$prefix = "";
$tmp = "";
$last = "";
if (strlen($file['name']) > 99) {
$pos = strrpos( $file['name'], "/" );
if (is_string($pos) && !$pos) {
//define("UP_ERROR",'if (is_string(\$pos) && !\$pos)');
return FALSE;
}
$prefix = substr( $file['name'], 0 , $pos );
$file['name'] = substr( $file['name'], ($pos+1));
if (strlen($prefix) > 154) {
//define("UP_ERROR",'if (strlen(\$prefix) > 154)');
return FALSE;
}
}
$mode = sprintf("%6s ", decoct($file['mode']));
$uid = sprintf("%6s ", decoct($file['uid']));
$gid = sprintf("%6s ", decoct($file['gid']));
$size = sprintf("%11s ", decoct($file['size']));
$mtime = sprintf("%11s ", decoct($file['mtime']));
$tmp = pack("a100a8a8a8a12a12",$file['name'],$mode,$uid,$gid,$size,$mtime);
$last = pack("a1" , $file['typeflag']);
$last .= pack("a100" , $file['linkname']);
$last .= pack("a6", "ustar"); // magic
$last .= pack("a2", "" ); // version
$last .= pack("a32", $file['uname']);
$last .= pack("a32", $file['gname']);
$last .= pack("a8", ""); // devmajor
$last .= pack("a8", ""); // devminor
$last .= pack("a155", $prefix);
$test_len = $tmp . $last . "12345678";
$last .= $this->internal_build_string( "\0" , (512 - strlen($test_len)) );
$checksum = 0;
for ($i = 0 ; $i < 148 ; $i++ ) {
$checksum += ord( substr($tmp, $i, 1) );
}
for ($i = 148 ; $i < 156 ; $i++) {
$checksum += ord(' ');
}
for ($i = 156, $j = 0 ; $i < 512 ; $i++, $j++) {
$checksum += ord( substr($last, $j, 1) );
}
$checksum = sprintf( "%6s ", decoct($checksum) );
$tmp .= pack("a8", $checksum);
$tmp .= $last;
$tmp .= $file['data'];
if ($file['size'] > 0) {
if ($file['size'] % 512 != 0) {
$homer = $this->internal_build_string( "\0" , (512 - ($file['size'] % 512)) );
$tmp .= $homer;
}
}
$tardata .= $tmp;
}
$tardata .= pack( "a512", "" );
if (extension_loaded("zlib")) {
$tardata = gzencode ($tardata,9);
$fp = fopen($tarfile, 'wb');
fwrite($fp, $tardata, strlen($tardata));
fclose($fp);
$gzip = 'gz';
} else {
$fp = fopen($tarfile, 'wb');
fputs($fp, $tardata, strlen($tardata));
fclose($fp);
$gzip = 'tar';
}
$this->_SIZE = filesize($tarfile);
return $gzip;
}
function internal_build_string($string="", $times=0) {
$return = "";
for ($i=0 ; $i < $times ; ++$i ) {
$return .= $string;
}
return $return;
}
}
?> (Отредактировано автором: 30 мая 2011 — 09:37) |
|
|
Pauk |
Отправлено: 31 мая 2011 — 17:48
|
Advanced Member
Покинул форум
Сообщений всего: 327
Дата рег-ции: Март 2009
Репутация: 6
|
Юрий спасибо большое, думал абсолютно все исправления стоят... поправил файл, но он отличался от того, на который вы давали ссылку, правда не знаю насколько критично:
Спойлер (Отобразить)CODE:<?php
/****************************************************************************
* ExBB v.1.1 *
* Copyright (c) 2002-20хх by Alexander Subhankulov aka Warlock *
* *
* http://www.exbb.net *
* email: admin@exbb.net *
* *
****************************************************************************/
/****************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
****************************************************************************/
define('ATTACH',true);
define('IN_EXBB', TRUE);
include('./include/common.php');
$fm->_GetVars();
$fm->_String('action');
switch ($fm->input['action']) {
case 'attach' : attachment();
break;
case 'error' : ImgError();
break;
case 'link' : create_tmb($fm->_String('img'));
break;
default: mailtouser(); break;
}
function ImgError() {
header("Content-Type: image/png");
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: inline; filename=\"error404.png\"");
header("Content-Length: ".(string)(filesize("im/images/error404.png")));
readfile("im/images/error404.png");
exit;
}
function attachment() {
global $fm;
$img = $fm->_Boolean($fm->input,'img');
if (($forum_id = $fm->_Intval('f')) === 0 || ($topic_id = $fm->_Intval('t')) === 0 || ($attach_id = $fm->_Intval('id')) === 0) {
if ($img === TRUE ) ImgError();
else $fm->_Message($fm->LANG['MainMsg'],"aaa".$fm->LANG['CorrectPost']);
}
$allforums = $fm->_Read(FM_ALLFORUMS);
if (!isset($allforums[$forum_id])) {
if ($img === TRUE ) ImgError();
else $fm->_Message($fm->LANG['MainMsg'],$fm->LANG['CorrectPost']);
}
if ($allforums[$forum_id]['private'] === TRUE && !defined('IS_ADMIN')) {
if ($fm->user['id'] === 0) {
if ($img === TRUE ) ImgError();
else $fm->_Message($fm->LANG['MainMsg'],$fm->LANG['UserUnreg'],'loginout.php');
}
$userprivate = (isset($fm->user['private'][$forum_id]) && $fm->user['private'][$forum_id] === TRUE) ? TRUE:FALSE;
if ($userprivate === FALSE) {
if ($img === TRUE ) ImgError();
else $fm->_Message($fm->LANG['PrivatForum'],$fm->LANG['PrivatRule']);
}
}
unset($allforums);
if (!file_exists('forum'.$forum_id.'/attaches-'.$topic_id.'.php')) {
if ($img === TRUE ) ImgError();
else $fm->_Message($fm->LANG['MainMsg'],$fm->LANG['CorrectPost']);
}
$attaches = $fm->_Read2Write($fp_attach,'forum'.$forum_id.'/attaches-'.$topic_id.'.php');
if (count($attaches) === 0) {
$fm->_Fclose($fp_attach);
unlink('forum'.$forum_id.'/attaches-'.$topic_id.'.php');
if ($img === TRUE ) ImgError();
else $fm->_Message($fm->LANG['MainMsg'],$fm->LANG['CorrectPost']);
}
if (!file_exists('uploads/'.$attaches[$attach_id]['id'])) {
$fm->_Fclose($fp_attach);
if ($img === TRUE ) ImgError();
else $fm->_Message($fm->LANG['MainMsg'],$fm->LANG['CorrectPost']);
}
$attaches[$attach_id]['hits']++;
$fm->_Write($fp_attach,$attaches);
if ($fm->_Boolean($fm->input,'icon') === TRUE) { // application/x-gzip
create_tmb('uploads/'.$attaches[$attach_id]['id']);
} else {
$type = 'unknown/unknown';
switch ($attaches[$attach_id]['type']) {
case 'gz' : $attaches[$attach_id]['file'] = preg_replace("#\.[A-Za-z0-9]{1,5}$#is",".tar.gz",$attaches[$attach_id]['file']);
$type = 'application/x-gzip';
break;
case 'tar' : $attaches[$attach_id]['file'] = preg_replace("#\.[A-Za-z0-9]{1,5}$#is",".tar",$attaches[$attach_id]['file']);
$type = 'application/x-tar';
break;
default : $extension = strtolower(substr(strrchr($attaches[$attach_id]['file'],'.'),1));
switch ($extension) {
case 'gif' : $type = 'image/gif'; break;
case 'jpg' :
case 'jpeg' : $type = 'image/pjpeg'; break;
case 'pdf' : $type = 'application/pdf'; break;
case 'zip' : $type = 'application/zip'; break;
case 'pdf' : $type = 'application/pdf'; break;
default : $type = 'unknown/unknown'; break;
};
break;
}
header("Content-Type: ".$type);
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: ".(($img === TRUE) ? "inline":"attachment")."; filename=\"".$attaches[$attach_id]['file']."\"");
header("Content-Length: ".(string)($attaches[$attach_id]['size']));
readfile('uploads/'.$attaches[$attach_id]['id']);
}
exit;
}
function create_tmb($bigimgsrc) {
$rgb = 0xFFFFFF;
$quality = 100;
$width = 250;
if ($size = @getimagesize($bigimgsrc)){
if ($size === false) {
ImgError();
return false;
}
if ($size[0]<=350){
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
$icfunc = "imagecreatefrom" . $format;
if (!function_exists($icfunc)) {
ImgError();
return false;
}
$width1 = $size[0];
$height1 = $size[1];
header("Content-type: image/jpg");
$bigimg = $icfunc($bigimgsrc);
$trumbalis = imagecreatetruecolor($width1, $height1);
imagefill($trumbalis, 0, 0, $rgb);
imagecopyresampled($trumbalis, $bigimg, 0, 0, 0, 0, $width1, $height1, $size[0], $size[1]);
imagejpeg($trumbalis);
flush();
imagedestroy($bigimg);
imagedestroy($trumbalis);
}
else{
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
$icfunc = "imagecreatefrom" . $format;
if (!function_exists($icfunc)) {
ImgError();
return false;
}
$x_ratio = $size[0]/$width;
$height = floor($size[1]/$x_ratio);
header("Content-type: image/gif");
$bigimg = $icfunc($bigimgsrc);
$trumbalis = imagecreatetruecolor($width, $height);
imagefill($trumbalis, 0, 0, $rgb);
imagecopyresampled($trumbalis, $bigimg, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
imagejpeg($trumbalis);
flush();
imagedestroy($bigimg);
imagedestroy($trumbalis);
}
} else {
ImgError();
}
return;
}
?>
(Отредактировано автором: 31 мая 2011 — 17:49) |
|
|
|