Kun lataan web-kamerasta kuvan PHP-ohjelmassa koodilla [<img src=http://omadomain.com/cgi/jpg/image.cgi>],
niin image.cgi ei anna kuvalle nimeä. Tarkennuksena vielä, ohjelma tulostaa selaimen sivulle vain em. kuvan, mutta sivun lähdekoodi on tyhjä ja ominaisuuksissa on image.cgi.
Miten saisin PHP-ohjelmassa nimettyä kuvan ja tallennettua kuvan koneelle?
Kesän poika kirjoitti:
lataan web-kamerasta kuvan PHP-ohjelmassa koodilla <img...> – – Tarkennuksena vielä, ohjelma tulostaa selaimen sivulle vain em. kuvan, mutta sivun lähdekoodi on tyhjä ja ominaisuuksissa on image.cgi.
Aivan käsittämätön kertomus. Miten sivun lähdekoodi voi olla tyhjä, jos sillä on sisältöä? Missä ”ominaisuuksissa” image.cgi on?
Selitä nyt uudestaan alusta asti: Mille sivulle selain menee? Mitä sivun HTML-koodissa lukee? Miten lataat ”web-kamerasta kuvan PHP-ohjelmassa”? Mikä on tavoite ja mikä ongelma?
Kesän poika kirjoitti:
Miten saisin PHP-ohjelmassa nimettyä kuvan ja tallennettua kuvan koneelle?
Jos nyt oikeasti haluat PHP:llä tallentaa kuvan koneelle, koodi näyttää esim. tältä:
file_put_contents("kuva.jpg", file_get_contents("http://.../image.cgi"));
Jos tarkoitit kuitenkin, että image.cgi on PHP:llä kirjoitettu skripti, joka tuottaa kuvan (ei siis suinkaan sivua tai esittämääsi img-tagia vaan todella kuvan), tarvitset Content-Disposition-otsikkoa:
header("Content-Disposition: inline; filename=kuva.jpg");
Jos haluat vielä yrittää pakottaa tallennuksen sen sijaan, että kuva näkyisi selaimessa, voit käyttää attachment-parametria:
header("Content-Disposition: attachment; filename=kuva.jpg");
Kiitos vastauksesta.
Lisävalaistusta, eli ongelma tuli eteen, kun käytössä oleva web-kamera A-LINK IPC1 alkoi oikuttelemaan ja siinä olevaan FTP-ohjelmaan tuli jotain häikkää ja kuvat ei mene enää serverille ja sen korvaajaksi olen tekemässä mainittua kuvan tallennusohjelmaa.
Ohjelman tarkoitus on siis tallentaa web-kameran kuva määräajoin (crontab) serverillä olevaan kuvatiedostoon.
Kuvan saa noudettua web-kamerasta ao. scriptillä, mutta miten saan kuvan tallennettua myöhempää katsomista varten?
<?php $kuva_haettu="<img src=http://omadomain.com/cgi/jpg/image.cgi>"; echo $kuva_haettu; ?>
Mod. lisäsi kooditagit!
Kesän poika kirjoitti:
mutta miten saan kuvan tallennettua myöhempää katsomista varten?
Metabolix kirjoitti:
Jos nyt oikeasti haluat PHP:llä tallentaa kuvan koneelle, koodi näyttää esim. tältä:
file_put_contents("kuva.jpg", file_get_contents("http://.../image.cgi"));
Kesän poika kirjoitti:
Kuvan saa noudettua web-kamerasta ao. scriptillä – –
Koodisi ei todellakaan hae kuvaa mistään. Koodisi ainoastaan tulostaa pätkän HTML-koodia. Voisit tehdä saman täysin ilman PHP:tä kirjoittamalla tiedostoon pelkän HTML-koodin.
<img src="http://.../image.cgi" />
Kuvan tallentamiseen PHP:llä annoin jo ohjeen.
file_put_contents("kuva.jpg", file_get_contents("http://.../image.cgi"));
Toisaalta onnistuit kysymään kysymyksen, joka ei suoranaisesti edes koske ongelmaasi. PHP on tarpeeton, koska voisit ladata kuvan crontabissa esimerkiksi wget-ohjelmalla.
wget http://.../image.cgi -qO kuva.jpg
Kiitos vastauksista, mutta kuva ei valitettavasti siirry palvelimelle, eli kuva.jpg latautuu, mutta kuvan koko on 0B? Kokeilin myös ajaa tuon crontab scriptin, mutta sama lopputulos.
Silloin selvästikään palvelimesi ei saa kuvaa ladattua. Kannattaa nyt lähteä selvittämään asiaa wgetillä (ilman PHP:tä). Esimerkiksi näin saat lokitiedoston, josta ehkä selviää, mikä menee pieleen:
wget http://.../image.cgi -o loki.txt -O kuva.jpg
Sain lokitiedot:
--2014-12-20 21:45:01-- http://xxx.xxx.xxx.xxx/cgi/jpg/image.cgi Connecting to xxx.xxx.xxx.xxx:80... failed: Connection refused.
Sittenpä vain konfiguroit systeemisi niin, että yhteys palvelimelta tuohon osoitteeseen toimii. Vaikea neuvoa tietämättä, mihin ”omadomain.com” osoittaa (eli millä laitteella image.cgi on) ja missä palvelin sijaitsee ja millaisia palomuureja tai reitittimiä on näiden välillä.
Voiko em. scripteihin sisällyttää käyttäjätunnksen ja salasanan, kun web-kameraan on sellaiset asetettu?
Varmasti voi, jos on tarpeen. Kuitenkin virheilmoituksen perusteella yhteys ei ylipäänsä mene perille; salasanan tarpeesta tulisi HTTP-virhe 401 Unauthorized tai 403 Forbidden.
Connecting to www.ohjelmointiputka.net... connected. HTTP request sent, awaiting response... 401 Unauthorized
Vähän ymmärrän ohjelmoinnista ja esiin nouseekin kysymys, että miksi sen kuvan saa sieltä kuitenkin selaimelle näkyviin?
Kaveri joka asensi modeemin ja laittoi kiinteän IP-osoitteen kameralle sanoi, että ulospäin ei ole mitään estoja.
Ilmeisesti kaverisi oli jollain tavalla väärässä.
Onko kamera sinulla sisäverkossa (samassa paikassa kuin oma koneesi) ja palvelin taas jossain ulkopuolella netissä, vai miten on? Minne tuo ”omadomain.com” osoittaa? Minkä IP-osoitteen näet omalla koneellasi ja palvelimella komennolla ”nslookup omadomain.com” tai ”ping omadomain.com”?
Säästäisit paljon vaivaa kaikilta, jos selittäisit koko tilanteen perusteellisesti, ettei tarvitsisi yrittää asia kerrallaan ratkaista.
Kameralle on oma IP-osoite, mutta saman modeemin(Inteno FG500-R1) takana kun oma kone, modeemilta langaton yhteys kameralle, palvelin on ulkopuolella int2000.net, "omadomain.com" osoittaa suoraan kameraan.
Jos olisi oikeasti noin, homma varmaan toimisi kuin rasvattu.
Äsken sanoit, että kameralla on kiinteä IP-osoite. Nettiin ei saa kiinteää IP-osoitetta, ellei erikseen osta sellaista, ja olisi aika hullua ostaa kameralle kiinteä, julkinen IP-osoite. Luultavasti nyt siis kameralla on sisäverkossa kiinteä osoite, jolloin herää kysymys, osoittaako ”omadomain.com” oikeasti netissä mihinkään vai pelkästään sisäverkossa. Oletko oikeasti hankkinut jostain domainin ja säätänyt sille IP-osoitteen, vai oliko se vain kaverisi purkkaviritelmä? Tarkista myös modeemin asetuksista, että myös netistä tulevien yhteyksien TCP-portti 80 on ohjattu kameran IP-osoitteeseen. Toisaalta muista silloin hoitaa salasanasuojaus, koska kuka tahansa voi ottaa yhteyden kameraasi ja nykyään melko varmasti joku yrittääkin.
Kun saat kaiken muun toimimaan, voit lisätä wgetille käyttäjätiedot parametreilla --http-user=nimi ja --http-password=salasana, jos kamera käyttää tällaista alkeellista kirjautumistapaa.
Kameralle on kiinteä IP-osoite, joka sisältyi tilaamaani valokuituliittymän kauppaan, TCP-portti on 80 ja netistä pääsee katsomaan kameran live-kuvaa, kun antaa oikeat tunnukset. Yhteyttä on testattu kotiverkon ulkopuolelta ja toimii.
Kiitos paljon avustanne ja ajastanne, mutta en taida pystyä selittämään tarkemmin asiaa.
”Connection refused” joka tapauksessa tarkoittaa, että jokin taho (esim. palomuuri tai kamera itse) aktiivisesti estää yhdistämisen annettuun osoitteeseen porttiin 80. Tämä tapahtuu jo ennen HTTP-pyynnön lähettämistä, joten kameran salasana ei voi vaikuttaa asiaan. Jos olet vakuuttunut, että sama osoite toimii joltain muulta koneelta, jää jäljelle teoreettinen mahdollisuus, että Int2000:n palvelin rajoittaa yhteyksiä. Voit kokeilla, saatko wgetillä ladattua netistä jotain muuta (esim. tämän sivun).
Lisäsin wgetille käyttäjätiedot ja sen jälkeen kuva siirtyi palvelimelle!
Voiko em. scripteihin jollain tavalla liittää käyttäjätietoja, kun kuvat pitää nimetä uudelleen tallennusvaiheessa?
Miten käyttäjätiedot ja kuvan nimeäminen liittyvät toisiinsa? Mistä käyttäjätiedoista edes puhut? Juurihan lisäsit jotkin käyttäjätiedot. Tosin selvästi jotain muutakin on tapahtunut, tai sitten käyttämäsi wget antaa aivan vääriä virheilmoituksia.
Taas kysyt niin oudosti, ettei tuosta ymmärrä, mitä pitäisi tapahtua. Mitä jos vain kysyisit suoraan sitä, mitä oikeasti yrität? Esimerkki: ”Miten saan kuvan nimeksi X?”
Eli, tarkoitus tehdä PHP:llä ohjelma joka siirtää kuvan kamerasta palvelimella olevaan kuvatiedostoon.
-nouda kuva kamerasta (käyttäjätiedot, kun sitä kuvaa ei sieltä muuten saanut)
-anna kuvalle aikaan sidottu nimi
-tallenna kuva serverillä olevaan kuvatiedostoon
ohjelmaa ajetaan crontabista esim. kerran tunnissa
Auttaisiko esim. tämä:
wget http://.../image.cgi --http-user=x --http-password=y -qO kuva-`date +%Y-%m-%d_%H-%M-%S`.jpg
Tietenkin voit tehdä saman myös PHP:llä:
<?php $time = date("Y-m-d_H-i-s"); $filename = "kuva-{$time}.jpg"; $url = "http://.../image.cgi"; $auth = base64_encode("tunnus:salasana"); $options = ['http' => ['header' => "Authorization: Basic {$auth}"]]; $context = stream_context_create($options); $data = file_get_contents($url, false, $context); if ($data === false) { // Virhe! exit(1); } file_put_contents($filename, $data);
Metabolix kirjoitti:
Auttaisiko esim. tämä:
wget http://.../image.cgi --http-user=x --http-password=y -qO kuva-`date +%Y-%m-%d_%H-%M-%S`.jpg
Yksinkertaista kun sen osaa!
Kiitos avusta ja Hyvää Joulua keskusteluun osallistuneille.
Aihe on jo aika vanha, joten et voi enää vastata siihen.