Autor Zpráva
LExtR
Profil
Zdravím,

mám tu upload obrázku společně s vkládáním dat do mysql formulářem. Potřeboval jsem aby se přejmenovali obrázky pokud existují stejné názvy. Jenže teď mi nechce move_uploaded_file() nový název.

1) Warning: move_uploaded_file(): The second argument to copy() function cannot be a directory in /home/xxx/public_html/add.php on line 45

2) Warning: move_uploaded_file(): Unable to move '/tmp/phpJPVaO2' to 'backgrounds/' in /home/xxx/public_html/add.php on line 45

Kód:

    include "conn.php";
    
    $conn = new mysqli($dbserver, $dbuser, $dbpw, $dbname);

    if ($conn->connect_error) {
        die("Chyba připojení: " . $conn->connect_error);
    }
    
if(isset($_FILES['image'])){
    $file_name = $_FILES['image']['name'];
    $file_size =$_FILES['image']['size'];
    $file_tmp =$_FILES['image']['tmp_name'];
    $file_type=$_FILES['image']['type'];
    $name=$_POST['name'];
    $codes=$_POST['code'];    
    
    $actual_name = pathinfo($file_name,PATHINFO_FILENAME);
    $original_name = $actual_name;
    $extension = pathinfo($file_name, PATHINFO_EXTENSION);

    $i = 1;
    while(file_exists('backgrounds/'.$actual_name.".".$extension))
    {           
        $actual_name = (string)$original_name.$i;
        $name = $actual_name.".".$extension;
        $i++;
    }
    
    $extensions = array("jpeg","jpg","png");   
     
    $file_ext=explode('.',$_FILES['image']['name'])    ;
    $file_ext=end($file_ext);   
    
    if(in_array($file_ext,$extensions)=== false){
       $errors[]="povolené jsou pouze formáty JPG, JPEG a PNG";
    }
      
    if($file_size > 2097152){
       $errors[]='Obrázek nesmí být větší jak 2 MB';
    }
      
    if(empty($errors)==true){
        move_uploaded_file($file_tmp,"backgrounds/".$name);
    }else{
        print_r($errors);
    }
    
    if(isset($_POST["pridat"])){
        $sql = "INSERT INTO quotes (author, quote, bg) VALUES ('". addslashes($_POST["author"]) ."','". addslashes($_POST["quote"]) ."','". addslashes($name) ."')";
        if ($conn->query($sql) === TRUE) {
            echo "<script>
                window.setTimeout(function() {
                    window.location = 'http://q/';
                  }, 5000);
                </script>
                <div class='alert alert-success'>
                      <strong>Výborně!</strong> Citát byl odeslán ke zpracování.
                    </div>";
        } else {
            echo "Chyba: " . $conn->error;
        }
    }
}
juriad
Profil
V případě, že kolize nenastala, tak se while neprovede ani jednou. Tedy $name bude pořád to definované na řádce 14 (které tam asi nemá co dělat). Pokud by POST['name'] bylo prázdné, tak se opravdu na řádce 43 pokusíš přesunout soubor do "backgrounds/". Warning ti říká, že cílové umístění musí být název souboru a nikoli adresáře.

Miochodem, silně ti doporučuji to přeuspořádat nebo rozdělit do funkcí, protože se ti tu plete hromada proměnných dohromady a netušíš, co která obsahuje.
juriad
Profil
Návrh řešení; netestováno, neobsahuje syntaktické chyby.

<?php

function checkSize($file, &$errors) {
    $return = TRUE;

    # file size
    $size = $_FILES[$file]['size'];
    if ($size > 2 * 1024 * 1024){
        $errors[] = 'Obrázek nesmí být větší jak 2 MB';
        $return = FALSE;
    }

    return $return;
}

function checkType($file, &$errors) {
    $return = TRUE;

    # check extension
    $extensions = array("jpeg", "jpg", "png");
    $extension = strtolower(pathinfo($_FILES[$file]['name'], PATHINFO_EXTENSION));
    
    if (!in_array($extension, $extensions)) {
        $errors[] = 'Povolené jsou pouze přípony JPG, JPEG a PNG';
        $return = FALSE;
    }

    # check mime type
    $type = $_FILES[$file]['type'];
    if (strpos($type, 'image/') !== 0) {
        $errors[] = 'Povolené jsou pouze soubory obsahující obrázek';
        $return = FALSE;
    }

    return $return;
}

function globEscape($pattern) {
    return preg_replace('/[*?[\\]/', '[$0]', $pattern);
}

function getName($file, $destination, &$errors) {
    $fullname = $_FILES[$file]['name'];
    $fullname = str_replace(["\0", "/"], ["", "_"], $fullname);

    $filename = pathinfo($fullname, PATHINFO_FILENAME);
    # we replace . to reliably recognize an extension
    $filename = str_replace('.', '_', $filename);
    if (strlen($filename) == 0) {
        $filename = 'soubor';
    }

    $extension = strtolower(pathinfo($fullname, PATHINFO_EXTENSION));
    # do not trust that the programmer called checkType first
    if (strlen($extension) == 0) {
        $extension = 'ext';
    }

    # now we are sure that $filename.$extension is a valid name of the desired format

    if (!file_exists("$destination/$filename.$extension")) {
        $name = "$filename.$extension";
    } else {
        # glob search for all files with such name
        $dest = globEscape($destination);
        $fname = globEscape($filename);
        $ext = globEscape($extension);
        $files = glob("$dest/$fname.*.$ext", GLOB_NOSORT);

        # count number of such files and add 1
        $i = !$files ? 1 : count($files) + 1;
        $name = "$filename.$i.$extension";
    }

    return $name;
}

$destination = 'backgrounds';

if (isset($_FILES['image'])) {
    checkSize('image', $errors);
    checkType('image', $errors);
    $name = getName('image', $destination, $errors);
    if (empty($errors)) {
        move_uploaded_file($FILES['image']['tmp_name'], "$destination/$name");
    }
} else {
    print_r($errors);
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: