Autor Zpráva
Jaroslav Němeček
Profil
Zdravím, poradil by někdo? Mám problém, jak uložit zmenšený obrázek po jeho cropu. Díky moc za pomoc. Posílám zdrojové kódy.

#soubor index.php
<?php
if (! empty($_POST["upload"])) {
    if (is_uploaded_file($_FILES['userImage']['tmp_name'])) {
        $targetPath = "uploads/" . $_FILES['userImage']['name'];
        if (move_uploaded_file($_FILES['userImage']['tmp_name'], $targetPath)) {
            $uploadedImagePath = $targetPath;
        }
    }
}
?>

<?php
$imagePath = "initial-image.jpeg";
if (! empty($uploadedImagePath)) {
    $imagePath = $uploadedImagePath;
}
?>
<div class="bgColor">
    <form id="uploadForm" action="" method="post"
        enctype="multipart/form-data">

       <div id="uploadFormLayer">
            <input name="userImage" id="userImage" type="file"
                class="inputFile"><br> <input type="submit"
                name="upload" value="Submit" class="btnSubmit">

       </div>
    </form>
</div>
<div>
    <img src="<?php echo $imagePath; ?>" id="cropbox" class="img" /><br />
</div>
<div id="btn">
    <input type='button' id="crop" value='CROP'>
</div>
<div>
    <img src="#" id="cropped_img" style="display: none;">
</div>
<script type="text/javascript">
$(document).ready(function(){
    var size;
    $('#cropbox').Jcrop({
      aspectRatio: 1,
      onSelect: function(c){
       size = {x:c.x,y:c.y,w:c.w,h:c.h};
       $("#crop").css("visibility", "visible");     
      }
    });
 
   $("#crop").click(function(){
        var img = $("#cropbox").attr('src');
        $("#cropped_img").show();
        $("#cropped_img").attr('src','image-crop.php?x='+size.x+'&y='+size.y+'&w='+size.w+'&h='+size.h+'&img='+img);
    });
});
</script>
#soubor image-crop.php
<?php
  $img_r = imagecreatefromjpeg($_GET['img']);
  $dst_r = ImageCreateTrueColor( $_GET['w'], $_GET['h'] );
 
 imagecopyresampled($dst_r, $img_r, 0, 0, $_GET['x'], $_GET['y'], $_GET['w'], $_GET['h'], $_GET['w'],$_GET['h']);
  
 header('Content-type: image/jpeg');
  
 imagejpeg($dst_r);
  exit;
?>

Moderátor juriad: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
juriad
Profil
Už to skoro máš. Funkce imagejpeg bere jako druhý parametr jméno souboru, kam má obrázek uložit.

Mimochodem, na 5. řádku přesouváš upoadnutý obrázek do souboru, jehož jméno dodává uživatel - tedy pokud dva uživatelé uploadnou obrázek stejného jména, tak se přepíší. Jelikož na názvu obrázků na serveru málokdy záleží, je lepší zvolujit svoji strategii pojmenování: 1. pojmenovat jej jménem nebo ID uživatele (to by mělo být unikátní), 2. pojmenovat jej náhodně.
Jaroslav Němeček
Profil
juriad:
Ahoj, dík za pomoc, mohl bys mě prosím napsat co bude v závorce za imagejpeg(), mám jako druhý parametr vzít $img_r a složku kam se bude obrázek ukládat?. Ještě jednou dík za pomoc.
juriad
Profil
Můžeš to změnit třeba takto (od 7. řádky dál):
$rnd = bin2hex(random_bytes(16)); # nebo nějakým jiným způsebem si vymyslíš jméno
$cropped = "cropped/$rnd.jpg";
imagejpeg($dst_r, $cropped);
echo $cropped;

Od této chvíle image_crop.php nebude vracet obrázek, ale bude jej ukládat pod náhodným jménem a vracet jméno oříznutého obrázku.

Dál pak samozřejmě budeš muset změnit logiku tlačítka CROP. Místo změny pouze src obrázku, budeš muset AJAXem provolat image_crop.php se všemi parametry, zachytit výstup (jméno souboru) a ten pak použít pro nastavení src.
Keeehi
Profil
Ještě je vhodné zmínit, že se nikde nekontroluje co se na server nahrává. Kdokoli může nahrát jakýkoli soubor na tvůj server. Když to bude místo obrázku video, asi to nebude žádaná tragédie. Ale co když se někdo rozhodne tam nahrát php soubor? To už průšvih bude.

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:

0