Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tiedostotyyppi osoitteesta

t0ll0 [13.04.2011 19:23:13]

#

Moikka,

Tarkoituksena on saada selville tiedostotyyppi (mime?) annetusta osoitteesta ja muotona text/html, text/plain jne..

Olen yrittänyt monellakin tapaa mutta ongelmia tulee aina vastaan.. Joko googlella löytämäni funktiot eivät toimi palvelimellani (jonkinnäköisiä lisäosia) tai tekemäni purkka ei toimi luotettavasti..

Tässä viimeisin:

$url = 'http://osoite.com';

$mime = get_headers($url, 1);

if(is_array($mime['Content-Type'])){
$mime = $mime['Content-Type'][0];
}else{
$mime = $mime['Content-Type'];
}

echo $mime;

Tällä rimpsulla saadaan esimerkkkinä tälläisiä:
text/html
text/html;
text/html; charset=utf-8
tai joissakin tapauksissa kokonaan tyhjä.

Eli get_headersillä saadaan joka sivulta erillaisia taulukoita joista halutun tiedon saaminen ulos tuntuu käsittämättömän vaikealta.
Kenelläkään tiedossa luotettavaa tapaa saada tämä tiedostotyyppi ulos?

Kiitos avusta,
-t0ll0

Grez [13.04.2011 19:33:03]

#

Siis mikä tuossa on ongelmana? Sehän näyttää toimivan mainiosti. Katsot vaan että jos tuloksessa on ; niin otat vain sitä ennen olevan osan.

t0ll0 [13.04.2011 19:37:12]

#

Kuten kerroin niin joiltakin sivuilta palauttaa kokonaan tyhjän.
Vai onko tämä sitten se "luotettavin" keino selvittää tämä asia?


edit.
Sivuilta joilta palauttaa tyhjän kuitenkin näkyy seuraavaa:

print_r(get_headers($url, 1));

[Content-type] => Array ( [0] => text/html; charset=latin1 [1] => text/html; charset=latin1 )

Metabolix [13.04.2011 19:43:43]

#

Ensinnäkin, eihän tuokaan ole millään tavalla luotettava. Palvelin perustaa käsityksensä usein tiedoston päätteeseen, tai poikkeustapauksessa palvelin voi jättää tyypin kokonaan ilmoittamatta. Ainoa luotettava tapa olisi ladata tiedosto ja tunnistaa sen sisältö.

Jos nyt kuitenkin ongelma on tuon palvelimelta tulevan arvon muuttaminen tuttuun muotoon, alla on koko joukko erilaisia ratkaisuja. Kannattaisi itsekin opetella käsittelemään tekstiä PHP:llä.

function f1($str) {
  $arr = explode(";", $str, 2);
  return trim($arr[0]);
}

function f2($str) {
  $pos = strpos($str, ";");
  if ($pos !== false) {
    $str = substr($str, 0, $pos);
  }
  return trim($str);
}

function f3($str) {
  return preg_replace('#^\\s*([^;]*?)\\s*(?:;.*)?$#s', '$1', $str);
}

Näethän jälkimmäisessä viestissäsi, että palvelin palauttaa "Content-type"-otsikon (type pienellä) taulukkomuodossa (ilmeisesti siis useamman esiintymän). Ehkä sinun pitää tehdä jotain tällaista:

function get_content_type($url) {
  foreach (get_headers($url, 1) as $nimi => $arvo) {
    if (strcasecmp($nimi, "Content-Type") == 0) {
      if (is_array($arvo)) {
        $arvo = end($arvo);
      }
      return preg_replace('#^\\s*([^;]*?)\\s*(?:;.*)?$#s', '$1', $arvo);
    }
  }
}

t0ll0 [13.04.2011 20:04:33]

#

Ongelma ei suinkaan ole palautusarvon käsittely haluamaani muotoon vaan se että saatu arvo on joiltakin sivuilta tyhjä.

Metabolix huomasi sen mikä itseltäni jäi huomaamatta ja nyt toimii :)

Kiitoksia.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta