PDA

Просмотр полной версии : Ошибки 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 повреждённым, то есть скока удалось загрузить...

Если кто знает как устранить эту ошибку, то напшите способ!!!

NNNS
18.01.2008, 07:44
попробуй так
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);

?>