webForumDet fria alternativet

XML, bild, spara på servern?

6 svar · 592 visningar · startad av UrMe

UrMeMedlem sedan apr. 2001762 inlägg
#1

Jag måste skapa en sida som tar emot en XML-fil, och i denna XML-fil finns det en bild som är kodad med base64-data. Någon som har en guide/förslag på hur jag tar ut denna data och sparar ner filen till servern?

Så här kan det t.ex se ut:

    <content-elements>
      <content-element>
        <binary-content>base64-encoded binary data</binary-content>
        <charset>utf-8</charset>
        <content-id>dcs00407.jpg</content-id>
        <content-type>image/jpeg</content-type>
        <name>dcs00407.jpg</name>
        <filename>dcs00407.jpg</filename>
      </content-element>
    </content-elements>

i <binary-content> ligger då koden för bilden.

Är det bara parsea xml-filen, ta binary-content och köra base64_decode på den, sedan på något sätt spara ner det till servern?
Hmm kanske måste hitta någon lämplig exempelfil.

UrMeMedlem sedan apr. 2001762 inlägg
#2

en följdfråga, hur får jag tag i t.ex binary-content?
Detta går ju inte, ger bara felmeddelande:

$xml = simplexml_load_file("xmlfil.xml");
echo $xml->content-element->binary-content;

eftersom namnet innehåller "-".

nitro2k01Medlem sedan aug. 20039 342 inlägg
#3

Prova

echo $xml->'content-element'->'binary-content';
// eller kanske till och med
echo $xml['content-element']['binary-content'];
UrMeMedlem sedan apr. 2001762 inlägg
#4

Nej inget av dem fungerar, tror jag måste köra med xpath? Men får inte till hur jag skulle kunna hämta data med xpath, någon som har ett exempel?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#5

Det var en kvalificerad gissning, ändock en gissning. :)
Sättet att komma runt begränsningen med - i tagg-namnen gäller dock fortfarande.
Efter lite googlande kommer jag fram till följande: Den yttersta taggen tolkas som dokumentrot, så $sql innehåller (eller bör innehålla åtminstone) varje content-element. Om du alltid bara har ett content-element bör du kunna skriva

echo $sql['content-element']['binary-content'];

annars bör du kunna gå igenom elementen med en foreach-loop

foreach($xml as $picture){
  echo $picture->filename . ": " . $picture['binary-content'] . "\n";
}
SPiNMedlem sedan mars 20007 896 inlägg
#6

Exempel i XPath:

$xml = simplexml_load_file('filen.xml');
$binaryContent = $xml->xpath("/content-elements/content-element/binary-content");
$imageType = $xml->xpath("/content-elements/content-element/content-type");
header("content-type: " . $imageType[0]);
print base64_decode($binaryContent[0]);

Viss felhantering får du sköta själv (se till så att du faktiskt har poster på $binaryContent[0] och $imageType[0] t.ex.), men förhoppningsvis så bör ovanstående fungera. Det är dock otestat.

UrMeMedlem sedan apr. 2001762 inlägg
#7

Tackar! xpath exemplet fungerar perfekt, hade blandat in lite andra grejer i fredags som ställde till det för mig.

140 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)