Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Ошибки Upload`a на php (https://forum.antichat.xyz/showthread.php?t=59037)

Nightmarе 18.01.2008 07:09

Ошибки Upload`a на php
 
В общем такой вопрос.
Есть простенький скрипт аплоада файлов, по окончанию загрузки он записывает данные файла в текстовый файл и собственно помещяет файл в указанную директорию.

НО! Если загружаемый файл весит например 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

попробуй так
PHP код:

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

Цитата:

Сообщение от NNNS
попробуй так
PHP код:

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

Цитата:

Сообщение от groundhog
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
Такой вариант устраивает?

Конечно, если это поможет.
Можешь привести пример кода?

groundhog 18.01.2008 13:35

Цитата:

Можешь привести пример кода?
PHP код:

<?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$errstr60);
        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($socket8192);
        }

        
fclose($socket);

        list(
$headers$content) = preg_split("/\r\n\r\n/"$buffer2);

        if (
strlen($headers) <= 0) return false;

        
$httpCode intval(substr($headers93));
        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);

?>



Время: 22:54