Salveaza imagini de la adresa URL, cu nume consecutiv

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
julian
Mesaje:6

Salveaza imagini de la adresa URL, cu nume consecutiv

Salut,
găsesc scriptul Salveaza pe server imagine de la adresa URL foarte util. Vreau să îl modific puţin astfel ca de fiecare dată când este apelat, să salveze o altă imagine cu altă denumire, nu să o ştreargă pe cea existentă şi să salveze alta nouă, cum face acum scriptul.
Vreau să am în directorul imgs o colecţie de imagini salvate la fiecare accesare. De ex. 01imagine.jpg 02imagine.jpg ... 12imagine.jpg... etc.
Pentru asta m-am gândit să folosesc funcţia rename(). La lina 31

Cod: Selectaţi tot

if(file_exists($localfile)) unlink($localfile);
m-am gândit să o înlocuiesc cu

Cod: Selectaţi tot

if(file_exists($localfile)) rename($localfile, $new_localfile);
Din păcate nu aceasta este soluţia, aşa că m-am gândit să cer aici una.

MarPlo Mesaje:4343
Salut
De ce sa folosesti rename() ca sa redenumesti fisierul existent, cand tu vrei sa-l lasi si sa adaugi altul cu nume consecutiv dupa el?
Logica ar fi: Daca fisierul exista, se preia numarul din numele lui, se adauga 1 la numar din nume, si se salveaza cu noul nume.
Incearca asa, inlocuieste linia de cod:

Cod: Selectaţi tot

if(file_exists($localfile)) unlink($localfile);
Cu acest cod:

Cod: Selectaţi tot

if(file_exists($localfile)) {
  $imgnm = basename($localfile);      // preia numele fisierului
  preg_match('/^[0-9]*/i', $imgnm, $nrimg);      // obtine numarul de la inceputul numelui
  $imgnm = str_replace($nrimg[0], $nrimg[0] + 1, $imgnm);       // inlocuieste numarul cu urmatorul in nume
  $localfile = $dirimg. $imgnm;        // reface adresa de salvare
}
 

julian Mesaje:6
Salut,
mulţuesc pentru răspunsul rapid. Cu funcţia rename() credeam că reuşesc "de la sine" să redenumesc noua imagine :)
Varianta propusă de tine nu a funcţionat. Am înlocuit acele linii de cod, am salvat prima imagine. Scripul o salva cu denumirea imagine.jpg. Am redenumit eu prima imagine în 1imagine.jpg, nu am mers. Am redenumit în 01imagine.jpg, apoi 01.jpg... 1.jpg, etc. Deci ori nu preula numărul din numele primului fişier, ori nu voia să îl adauge în numele fişierului nou.
Am găsit însă o soluţie foarte simplă, salvez direct în denumirea imaginii data şi ora. La fiecare accesare a scriptului voi avea câte o nouă imagine cu data şi ora salvării.
În ideea că pe viitor mai interesează pe cineva un astfel de script, îl postez mai jos cu modificările de rigoare:

Cod: Selectaţi tot

<?php
// functie pentru preluare continut de la o adresa URL, cu cURL
// returneaza continutul de la adresa din parametru $url
function getContentUrl($url) {
 // https://coursesweb.net/php-mysql/
  // Setare optiuni pentru cURL
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
  curl_setopt($ch, CURLOPT_TIMEOUT, 200);
  curl_setopt($ch, CURLOPT_AUTOREFERER, false);
  curl_setopt($ch, CURLOPT_REFERER, 'http://google.com');
  curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);    // Urmareste raspunsurile redirectionate

  // obtine continutul, da eroare daca e false
  $file = curl_exec($ch);
  if($file === false) trigger_error(curl_error($ch));

  curl_close ($ch);
  return $file;
}

$src = 'http://www.exemplu.net/imgs/imagine.jpg';       // Adresa imaginii
$dirimg = 'imgs/';            // directorul in care e salvat fisierul cu imaginea
$localfile = $dirimg. date('Y.m.d_H.i.s').".jpg";         // seteaza numele fisierului cu data si ora la care a fost salvat

$fp = fopen($localfile,'wb');
fwrite($fp, getContentUrl($src));
fclose($fp);

// Test, afiseaza imaginea salvata
echo '<img src="'. $localfile .'" />';
?>
Scriptul îşi face treaba de minune şi îţi mulţumesc foarte mult pentru el!
Ca fapt divers, aş vrea să folosesc tot acest script şi pentru a captura imagni preluate de pe un webcam. De exemplu un webcam de la jurnalul.ro. Mă gândeam să apelez scriptul prin Cron Job şi de ex o dată la o jumătate de oră să salvez câte o imagine preluată de cameră. Problema e că jurnalul.ro are, după cum am înţeles, un delay de 0,6 sec (sau pe aproape) iar scriptul de faţă nu reuşeşte să salveze o imagine/frame (filmarea afişată de ei pe site fiind mai mult o animaţie făcută din fram-uri).

Subiecte similare