Премини към съдържанието
dalai.lamia

Проблем при качване на файл - винаги мисли, че е качен файл

    Препоръчан отговор


    Здравейте,

    Натъкнах се на следния проблем:

    Дори и да не съм избрал файл за качване, скриптът ми винаги мисли, че съм и съответно връща грешка. Пробвах с различни проверки (тия, които знам), но нищо не сработва. Моля за помощ.

    Това е частта, в която се обработва ъплоуда:

    	if(!empty($_FILES['image'])) {
    
    		// FILE UPLOAD MANAGEMENT
    		// Configuration
    		$allowed_filetypes = array('.jpg','.gif','.png'); // These will be the types of file that will pass the validation.
    		$max_filesize = 524288; // Maximum filesize in BYTES (currently 0.5MB).
    		$upload_path = '../files/image/News/'; // The place the files will be uploaded to.
    		 
    		$filename = $_FILES['image']['name']; // Get the name of the file (including file extension).
    		$ext = substr($filename, strpos($filename,'.'), strlen($filename)-1); // Get the extension from the filename.
    		 
    		// Check if the filetype is allowed, if not DIE and inform the user.
    		if(!in_array($ext,$allowed_filetypes)) {
    			$errors[] = "Позволените формати са JPG, GIF, PNG. ";
    		}
    		 
    		// Now check the filesize, if it is too large inform the user.
    		elseif(filesize($_FILES['image']['tmp_name']) > $max_filesize) {
    			$errors[] = "Максималният позволен размер е 500 KB. ";
    		}
    		 
    		// Check if we can upload to the specified path, if not inform the user.
    		elseif(!is_writable($upload_path)) {
    			$errors[] = "Записът в тази директория е забранен. ";
    		}
    			
    		// Upload the file to your specified path.
    		elseif(move_uploaded_file($_FILES['image']['tmp_name'],$upload_path . $filename)) {
    			$info = "Файлът беше успешно добавен. ";
    			$image = $filename;
    			// It worked.
    		}
    		else {
    			$errors[] = "Грешка при качването на файла. Опитай отново."; // It failed .
    		}
    	}
    

    Това е частта от формата, където прикачам файла:

    <tr>
    			<td>Изображение:</td>
    			<td colspan=\"3\">";
    				if(!empty($image)) { $form .= $image; }
    				else { $form .= "<input type=\"file\" name=\"image\" value=\"\" size=\"15\" maxlength=\"255\" />"; }  
    			$form .= "</td>
    		</tr>
    

    В БД, полето "image" в съответната таблица е VARCHAR (255) / Null = No / Default = None.

    Когато принтирам масива $_FILES['image'], за да видя има ли грешка, когато не съм прикачил файл, винаги дава:

    Array ( [name] => [type] => [tmp_name] => [error] => 4 => 0 )

    което значи, че не е прикачен файл и изпечатва първия вид грешка при проверката:

    "Позволените формати са JPG, GIF, PNG. "

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    Ако масивът е празен ,трябва да се отпечата : Array ( ) empty Явно твоят не е празен.

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    Ако масивът е празен ,трябва да се отпечата : Array ( ) empty

    Явно твоят не е празен.

    Да, така излиза. Само дето не мога да разбера какво го пълни този масив...

    Но, пък, от друга страна, не е ли изключение за масива тип $_FILES конкретно винаги да се съдържа нещо в него, по-конкретно Error = 0 , ако всичко е наред?

    Нали това са възможните грешки: моята е #4 - не е ли именно защото не съм качил файл..?

    array( 
            0=>"There is no error, the file uploaded with success", 
            1=>"The uploaded file exceeds the upload_max_filesize directive in php.ini", 
            2=>"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" 
            3=>"The uploaded file was only partially uploaded", 
            4=>"No file was uploaded", 
            6=>"Missing a temporary folder" 
    );
    Редактирано от dalai.lamia (преглед на промените)

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    Пробвай с това

    if (!($_FILES['image']['name'] == ""))

    вместо

    if(!empty($_FILES['image']))

    СТАНА!

    Благодаря!

    Само че аз сложих:

    if(!empty($_FILES['image']['name'])) {
    Но то върши същата работа.

    Значи трябва не да проверявам дали масивът $_FILES['image'] е пълен, защото той винаги е пълен, а да проверявам дали файлът си има име, т.е. ако няма име, няма и файл... хм... интересна логика.

    Редактирано от dalai.lamia (преглед на промените)

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    Обаче имаш един проблем. Не знам какви снимки ще се качват, но ако някой има същото име като друг качен файл, скрипта може да изгафи.

    Редактирано от dikidera (преглед на промените)

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    Обаче имаш един проблем. Не знам какви снимки ще се качват, но ако някой има същото име като друг качен файл, скрипта може да изгафи.

    Да, знам за този проблем. Ще добавя проверка - или ще преименува новия файл или просто ще казва на потребителя да смени името на файла. Важното е, че този проблем беше разрешен!

    Чудя се освен това дали да правя проверка за размерите на изображението - защото ако изпляскат една снимка с напр. 900x700 px размер ще се омаже страницата - и да карам потребителя да го resize-не на по-малко, или да го качвам така, както е, а после да го resize-вам при показване на страницата... По първия начин ще спестя място на сървъра и ще правя няколко изчисления по-малко... предложение тук?

    Редактирано от dalai.lamia (преглед на промените)

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    За проверка на размерите(height,width) на изображение ти трябва GD2 библиотеката, която хоста ти може да има или няма(но повечето имат). Според мен ги накарай сами да ги смаляват. Ще спестиш работата на PHP, а и направо сложи предупреждение още преди да качват за максималните размери.

    Редактирано от dikidera (преглед на промените)

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    За проверка на размерите(height,width) на изображение ти трябва GD2 библиотеката, която хоста ти може да има или няма(но повечето имат).

    Според мен ги накарай сами да ги смаляват. Ще спестиш работата на PHP, а и направо сложи предупреждение още преди да качват за максималните размери.

    Да, така и ще направя :angry23:

    А ето я проверката за съществуването на файл със същото име:

    elseif($dh = opendir($upload_path)) {
    			while (($file = readdir($dh)) !== false) {
    				if ($file == "." || $file == "..") continue;
    				if ($file == $filename) {
    					//$filename = $filename . "_1";
    					$errors[] = "Вече съществува файл с това име! Преименувай файла и го качи отново. ";
    				}
    			}
    		}
    

    Благодаря!

    Редактирано от dalai.lamia (преглед на промените)

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    По-добре го разкарай този elseif и използвай само if. Иначе ако искаш пробвай да генерираш и някакво уникално ID за тези снимки. EDIT: А, ако папката има много снимки, то няма ли четенето на цялата папка да отнеме доста време и само да се затормози харда?

    Редактирано от dikidera (преглед на промените)

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    По-добре го разкарай този elseif и използвай само if.

    Иначе ако искаш пробвай да генерираш и някакво уникално ID за тези снимки.

    EDIT: А, ако папката има много снимки, то няма ли четенето на цялата папка да отнеме доста време и само да се затормози харда?

    ОК, махам elseif, става if...

    За втората част си прав, но струва ми се моите PHP знания не стигат чак толкова далече, че да мога да напиша подобно нещо :angry23:

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    Регистрирайте се или влезете в профила си за да коментирате

    Трябва да имате регистрация за да може да коментирате това

    Регистрирайте се

    Създайте нова регистрация в нашия форум. Лесно е!

    Нова регистрация

    Вход

    Имате регистрация? Влезте от тук.

    Вход


    ×

    Информация

    Този сайт използва бисквитки (cookies), за най-доброто потребителско изживяване. С използването му, вие приемате нашите Условия за ползване.