Просмотр полной версии : Ошибки Upload`a на php
Nightmarе
18.01.2008, 07:09
В общем такой вопрос.
Есть простенький скрипт аплоада файлов, по окончанию загрузки он записывает данные файла в текстовый файл и собственно помещяет файл в указанную директорию.
НО! Если загружаемый файл весит например 100 метров и при 60 метрах закачка обрывается, то этот самый битый файл помещяется в директорию, и запись о нём заносится в текстовую базу.
Я не могу решить чё тут сделать можно, как отследить если загрузка прервалась?
Я пробовал так:
$movefile = "./storage/" . $filecrc; // $filecrc - md5 файла
if(copy($_FILES['upfile']['tmp_name'], $movefile))
{
} else {
die;
}
$filelist = fopen("./files.txt","a+");
fwrite($filelist, "информация о файле и т.д...");
fclose($filelist);
Но всё-равно запись в файл происходит, и он кладётся в директорию storage повреждённым, то есть скока удалось загрузить...
Если кто знает как устранить эту ошибку, то напшите способ!!!
попробуй так
set_time_limit(0);
...
$movefile = "./storage/" . $filecrc; // $filecrc - md5 файла
if(copy($_FILES['upfile']['tmp_name'], $movefile))
{
$filelist = fopen("./files.txt","a+");
fwrite($filelist, "информация о файле и т.д...");
fclose($filelist);
}
else
{
die();
}
Nightmarе
18.01.2008, 07:59
попробуй так
set_time_limit(0);
...
$movefile = "./storage/" . $filecrc; // $filecrc - md5 файла
if(copy($_FILES['upfile']['tmp_name'], $movefile))
{
$filelist = fopen("./files.txt","a+");
fwrite($filelist, "информация о файле и т.д...");
fclose($filelist);
}
else
{
die();
}
Пробовал. Ничё не изменилось.
groundhog
18.01.2008, 11:04
Nightmarе, пробуй не пробуй, а это ограничение задаётся в настройках PHP. В настройках стоит ограничение на максимальный размер загружаемых на сервер файлов. Думаю, что в твоём случае этот размер установлен в 60Мб. Значения, которые за это отвечатют - upload_max_filesize и post_max_size (в php.ini). Значения этих параметров не могут изменяться с помощью функции ini_set() внутри скрипта PHP. Как вариант могу посоветовать использование файла .htaccess в корне твоего DocumentRoot со следующим содержанием (обрати внимание, что PHP должен работать как модуль!!!):
<IfModule mod_php4.c>
php_value upload_max_filesize 50M
php_value post_max_size 50M
</IfModule>
или
<IfModule mod_php5.c>
php_value upload_max_filesize 128M
php_value post_max_size 128M
</IfModule>
Ну и, конечно, не забывай использовать в аплоаде set_time_limit(0). Что же касается ошибок, возникающих из-за размера файла, то почему бы тебе не анализировать поле $_FILES['upfile']['error']? Оно отлично от нуля при возникновении ошибок...
Nightmarе
18.01.2008, 12:57
Nightmarе, пробуй не пробуй, а это ограничение задаётся в настройках PHP. В настройках стоит ограничение на максимальный размер загружаемых на сервер файлов. Думаю, что в твоём случае этот размер установлен в 60Мб. Значения, которые за это отвечатют - upload_max_filesize и post_max_size (в php.ini). Значения этих параметров не могут изменяться с помощью функции ini_set() внутри скрипта PHP. Как вариант могу посоветовать использование файла .htaccess в корне твоего DocumentRoot со следующим содержанием (обрати внимание, что PHP должен работать как модуль!!!):
<IfModule mod_php4.c>
php_value upload_max_filesize 50M
php_value post_max_size 50M
</IfModule>
или
<IfModule mod_php5.c>
php_value upload_max_filesize 128M
php_value post_max_size 128M
</IfModule>
Ну и, конечно, не забывай использовать в аплоаде set_time_limit(0). Что же касается ошибок, возникающих из-за размера файла, то почему бы тебе не анализировать поле $_FILES['upfile']['error']? Оно отлично от нуля при возникновении ошибок...
groundhog Я в курсе не только про маскимальный размер файла, я так-же знаю и про максимальный объём передачи методом post\get, с этим у меня всё в порядке.
Файл заливается в любом случае, если 100 метров или гигабайт закачать без ошибок, то всё ОК, но иногда скорость рвётся или мало ли что, закачка останавливается и недокачанный файл остаётся висеть на сервере, кроме того информация о нём ещё записывается...
Функцией $_FILES['upfile']['error'] я щас и займусь...
И ещё вопрос, может это и глупо, но можно ли как нибудь получить информацию о файле (размер или md5 сумму) не заливая его на сервер??? Кто знает, может можно...
groundhog
18.01.2008, 13:03
Функцией $_FILES['upfile']['error'] я щас и займусь...
Это не функция, это всего-лишь элемент ассоциативного массива, в котором сохраняется статус операции аплоада.
И ещё вопрос, может это и глупо, но можно ли как нибудь получить информацию о файле (размер или md5 сумму) не заливая его на сервер??? Кто знает, может можно...
Стандартными средствами нет. Но вот если ты организуешь HEAD запрос к удалённому файлу, и из полученных хидеров ответа выцепишь заголовок Content-Length, то определишь размер файла с точностью до байта. Такой вариант устраивает?
Nightmarе
18.01.2008, 13:06
Попробовал...
$_FILES['upfile']['error'] - возвращает 0
set_time_limit(0); - что с ним что без него всё одинаково :(
Nightmarе
18.01.2008, 13:08
Такой вариант устраивает?
Конечно, если это поможет.
Можешь привести пример кода?
groundhog
18.01.2008, 13:35
Можешь привести пример кода?
<?php
/**
* Remote size fetcher function
*
* Retrieve the size of remote file
* from it's Content-Length header at
* HEAD method request
*
* @param string URL of remote file
* @return mixed double - the size of
* remote file in bytes,
* or false at failed
* operation.
*/
function getRemoteFileSize ($remoteUrl) {
$urlData = parse_url($remoteUrl);
if (!isset($urlData["host"])) return false;
if (!isset($urlData["port"])) $urlData["port"] = 80;
if (!isset($urlData["path"])) $urlData["path"] = "/";
$socket = fsockopen($urlData["host"], $urlData["port"], $errno, $errstr, 60);
if (!$socket) return false;
$resource = $urlData["path"];
if (isset($urlData["query"])) $resource .= "?{$urlData["query"]}";
$sendData = "HEAD {$resource} HTTP/1.1\r\n";
$sendData .= "Host: {$urlData["host"]}\r\n";
$sendData .= "User-Agent: DaMaGeLaB file fetcher\r\n";
$sendData .= "Accept: */*\r\n";
$sendData .= "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\r\n";
$sendData .= "Pragma: no-cache";
$sendData .= "Connection: Close\r\n\r\n";
$ret = fwrite($socket, $sendData);
if (!$ret) return false;
$buffer = "";
while (!feof($socket)) {
$buffer .= fgets($socket, 8192);
}
fclose($socket);
list($headers, $content) = preg_split("/\r\n\r\n/", $buffer, 2);
if (strlen($headers) <= 0) return false;
$httpCode = intval(substr($headers, 9, 3));
if ($httpCode != 200) return false;
if (!preg_match("/Content\-Length: (\d+)\r\n/i", $headers, $matches))
return false;
return doubleval($matches[1]);
}
$ret = getRemoteFileSize ("http://ya.ru");
if (!$ret) exit("Couldn't get remote file size");
printf("Size of remote file is: %s bytes", $ret);
?>
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot