Joomla.it Forum
Non solo Joomla... => Sviluppo => : james81 03 Mar 2010, 19:13:12
-
Ciao a tutti
ho uno script in php con il quale salvo le url dell immagini all'interno del mio db, volevo sapere come si fà a salvare l'immagine direttamente nel mio spazio web, e salvare il relativo percorso nel mio db.
Graciess
-
ciao james81,
sinceramente non ho capito...
ciao,
marco
-
vorrei riuscire a salvare delle immagini che si trovano online (www.sitoonline.it/immagine1.gpj) nel mio spazio web (Es. cartella www.miosito.it/media/immagine1.jpg)
-
premesso che immagino tu sappia che puoi fare una cosa del genere solo se i siti sono tuoi, devi modificare lo script in modo che una volta ottenuto l'url legga l'immagine remota, vedi fopen su php.net
ciao,
marco
-
ehehe sì sì il sito è mio, spiego meglio:
ho un gestionale interno che mi pubblica tramite un file xml la lista prodotti presente nel mio db.
tramite uno script esterno importo i dati del file xml all'interno del mio db. Il problema è che per le immagini mi importa solo il collegamento al mio gestionale.
Purtroppo la banda che ho in ufficio non è sufficentemente potente per caricare le immagini dall'esterno, allora volevo esportarle direttamente nel mio spazio web.
Ho già provato a leggere l'fopen ma non capisco come salvare l'immagine :(
-
vediamo se ho capito:
il sito di origine si trova presso la tua azienda e contiene le immagini dei prodotti, in questo il gestionale scrive il file xml.
il sito di destinazione si trova presso un provider e carica il file xml inserendo i dati nel db.
che ne dici di caricare le immagini in ftp (anche in batch) sul sito di destinazione e modificare lo script di importazione perchè modifichi l'url in uno 'locale'?
ciao,
marco
-
due sono le problematiche, la pima è che in azienda non posso far girare script (che mi diventa un casino, e volevo quin di far eseguire tutto dallo script esterno.
-
in tal caso devi fare come detto sopra. guarda anche la pagina di fread per un esempio completo di come leggere un file remoto.
ciao,
marco
-
per leggerlo pensavo di seguire questa strada:
la variabile che contiene l'url dell'immagine si chiama $immagine
la stringa per la laettura la compongo così:
$readimage=fopen($immagine,"r");
è che poi non sò come fare
-
php.net/manual/en/function.fread.php
trovi l'esempio e la spiegazione di come leggere files remoti.
ciao,
marco
-
per la lettura quell'esempio lo avevo trovato
$filename = "c:\\files\\somepic.gif";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
una volta che mi sono messo il mio contenuto binario nella variabile $contents come lo scrivo in uno nuovo file all'interno di una cartella ?
-
leggila tutta la pagina e con attenzione: hai sbagliato esempio: "c:\\files\\somepic.gif" non mi pare un file remoto!!
e poi se non è fprint sarà fwrite ;D ;D ;D
ciao,
marco
-
si ho sbagliato a postare, il miko caso è:
$filename = $big;
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
ho trovato questo (è corretto)??
fwrite();
La funzione fwrite(); scrive una stringa nel file di testo che abbiamo aperto.
Esempio:
<?
$var=fopen("nome_file.txt","a+");
fwrite($var, "stringa di prova");
?>
In questo caso abbiamo aperto un file di testo (nome_file.txt) per aggiungere e lettura (a+) ed abbiamo scritto "stringa di prova" alla fine dei dati già scritti.
Nel caso il file non esista il server lo crea e vi scrive la frase da inserire.
-
mamma mia james!!
php.net/manual/en/function.fread.php, due righe sotto al codice che hai postato tu vi è 'Example #3 Remote fread() examples' a questo basta aggiungere l'fwrite
risulta qualcosa di simile a questo:
$url = "http://www.example.com/";
$img = "img.jpg";
$path = "/var/www/www.sito.com/images";
$handle = fopen("$url/$img", "rb");
$contents = '';
while (!feof($handle)) {
$contents .= fread($handle, 8192);
}
fclose($handle);
$handle = fopen("$path/$img", 'wb');
fwrite($handle, $contents);
fclose($handle);
senza controlli di errore, e senza controllo di che cosa esista già, il che non va d'accordo con la banda limitata.
ma soprattutto questo codice NON HA CONTROLLI DI SICUREZZA su che si carica e su dove lo si mette.
date le tue competenze, e dato che si tratta di attività d'impresa, ti consiglierei di farlo tu.
ti dico ciò con sincerità e senza presunzione, dato che, nonostante ti avessi segnalato l'errore, hai ancora sbagliato il codice; quello che hai indicato non può lavorare sugli stream (nella link citato: when reading remote files [...] reading will stop after a packet is available) e che non puoi conoscere la dimensione di un file remoto tramite http. inoltre il file da scrivere non deve essere aperto per lettura ed aggiunta ma solo per scrittura ed in modalità binaria. ma hai letto?
ciao,
marco
-
rieccomi!
gracies mille Marco con i tuoi super consigli sono riuscito a risolvere! :)
ho fatto qualche modifica allo script per estrapolarmi solo il nome dell'immagine e salvarlo nel db! :)
come segnalato giustamente da te, c'è comunque un problema di fondo legato al controllo se il file è già presente nella cartella, il che non è da poco visto che altrimenti ogni volta si dovrebbe lavorare circa 1700 imamgini! :P
posto la mia soluzione
$str1 = $img1 ;
$ar1= explode('/',$str1);
$imgmed = $ar1[count($ar1)-1];
$nomemed = $imgmed;
if (file_exist($nomemed))
{
} else {
$handle = fopen("$img1", "rb");
$contents = '';
while (!feof($handle)) {
$contents .= fread($handle, 8192);
}
fclose($handle);
$handle = fopen("$path/$imgmed", 'wb');
fwrite($handle, $contents);
fclose($handle);
}
-
lasciando perdere tutto il resto, dato che non ho seguito il discorso in toto...
al primo if prima verifichi se la condizione è vera, per poi non far fare nulla allo script, poi invece verifichi se quel file non c'è, facendo allora fare tutto il lavoro di salvataggio immagine...
sostituisci questa logica sbagliata con un
!file_exists
-
alla fine ho risolto, volevo chiedervi se qualcuno sa' come fare per impostare uno script sche ogni 100 secondi si interrompa, e si riavvii ???
-
imposta un timeout dello script a 99 secondi e un crontab che lo richiami ogni 100
-
umh...hai un esempio per vedere come fare?
-
scusa, ma perché vuoi fare ciò? non è che ti può bastare usare set_time_limit ad ogni ciclo?
ciao,
marco
-
ho un ciclo while con il quale estrapolo i vari prodotti e con un'altro sottociclo mi vado a salvare tutte le immagini del prodotto.
Purtroppo per ogni prodotto ci possono essere anche 10 Mb di immagini.
dove devo inserirlo set_time_limit(0) , in quale script?
-
UP