Autor Zpráva
radekHH
Profil *
XMl mám ve stringu $xml=""; a potřeboval bych mít možnost tento string nabídnout k uložení do PC = ke stažení. Jak na to?
Micruss
Profil
uložit do souboru? file_put_contents/fwrite.....
radekHH
Profil *
Do souboru na FTP nee ... chci, aby mě prohlížeč nabídnul soubor stáhnout. Načtu stránku a vyskočí okno ... uložit.
juriad
Profil
Dříve než vypíšeš xml na výstup, pošli hlavičku:
header('Content-type: text/xml');
header('Content-Disposition: attachment; filename="soubor.xml"');
...
echo $xml;
Rfilip
Profil
<?php
header('Content-type: text/xml');
header('Content-Disposition: attachment; filename="soubor.xml"');
echo $xml;
Mike8748
Profil
radekHH:
třeba
$xml="tvuj xml kod";
$name="soubor.xml";  // jmeno stahovaneho souboru, nemusi existovat, prohlizec stahovane xml bude chtit ukladat s timto nazvem

header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"" . $name) . "\""); 
echo $xml; 
VelkýBubák
Profil
Mike8748:
první řádek hlavičky by pro xml asi měl být: header('Content-Type: text/xml');
Čemu pomáhá ten druhý? Když to zakomentuju, nevidím rozdíl.
V třetím řádku změnit $name) na $name

Má proměnná $xml nějakej velikostní limit?
Alphard
Profil
V těch hlavičkách Mike8748 vynucuje nabídku k výběru programu/stažení, proto tam není přímo xml. Vhodně určeným kódováním se nic nezkazí, když není nastaveno, cílové zařízení ho odhadne/použije defaultní.

$xml je omezená velikostí paměti. Klidně tam může být postupné generování výstupu, je to jedno. Jen pak nepůjde nastavit délka souboru, což se tady stejně neděje (šlo by hlavičkou Content-Length).
VelkýBubák
Profil
Alphard:
Aha, děkuji.

Já to udělal bez proměnné. Prostě vypisuji co chci pomocí echo a na konci mám
header("Content-Type: text/xml");
header("Content-Disposition: attachment; filename=\"$soubor\"");
akorát mi to, nevím proč, nakonec stahovaného souboru vypíše i proměnnou z $POST['tabulka']
Alphard
Profil
Hlavičky rozhodně jako první, před jakýkoliv výstup.
VelkýBubák
Profil
Alphard:
Chápu, že když to je hlavička, asi by to tak být mělo, ale na výsledek to nemá vliv (alespoň u mě se nic nestalo)
Aj, ale koukám, že ta proměná u mě ve výpisu s tím nesouvisí (vypisuje se i když dám pryč hlavičku)
Alphard
Profil
Vy moc věříte tomu, to za určitých příznivých okolností funguje. Budiž :-) Až se něco rozbije, navštivte naše FAQ.
VelkýBubák
Profil
Alphard:
Omlouvám se, předpokládám že k důvod proč hlavičky před výstupem se dozvím z dokumentace, ale víc mne zaujala zmínka o příznivých okolnostech.

A poté co jsem konečně přišel na důvod, proč se mi ta proměnná vypisovala to začímám brát vážně (stačilo změnit uvozovky, ono tam bylo $_POST["tabulka"] - ale bylo na na začátku kódu před výpisem ostatního...)
Alphard
Profil
VelkýBubák [#13]:
Výstup se neodesílá hned klientovi, ale bývají nastaveny výstupní buffery. Pokud stihnete poslat hlavičky dřív, než tyto buffery přetečou, projde to. Když ne, vidíte už jen klasickou hlášku headers already sent….
VelkýBubák
Profil
Aha, děkuji
VelkýBubák
Profil
Jde nějak posílat z jednoho scriptu více xml souborů?

<?php
$pocetSouboru = 0;
$pocetZaznamu = 0;
$textik = "";
while($zaznam=mysql_fetch_array($vysledek5)) 
  {
$textik .= "<P>Příliš žluťoučký kůň úpěl ďábelské ódy. I příšerně červeňoučký kůň úpěl ďábelské ódy. Hleď, toť přízračný kůň v mátožné póze šíleně úpící. 
Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů. Loď čeří kýlem tůň obzvlášť v Grónské úžině. Ó, náhlý déšť již zvířil prach a čilá laň teď běží s houfcem gazel k úkrytům.</P> 
<P> Kŕdeľ šťastných ďatľov učí pri ústí Váhu mĺkveho koňa obhrýzať kôru a žrať čerstvé mäso. </P> 
";
 
if(ceil(strlen($textik)/1024)>= 1020) 
  {
  $textik .= "
  </myanimelist>";
  header("Content-Description: File Transfer");
  header("Content-Type: text/xml");
  header("Content-Disposition: attachment;filename=\"".$tabulka."-file".$pocetSouboru.".xml\"");
  echo $textik;
  unset($textik);
  $textik = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<myanimelist>";
  $pocetSouboru++;
  }
$pocetZaznamu++;   
}
$textik .= "
</myanimelist>";
  header("Content-Description: File Transfer");
  header("Content-Type: text/xml");
  header("Content-Disposition: attachment;filename=\"".$tabulka."-file".$pocetSouboru.".xml\"");
  echo $textik;
  unset($textik);
  $pocetSouboru++;
$info = "Informace k přenosu:

Přeneseno: ".$pocetSouboru." souborů, pro AniDB
Zpracováno: ".$pocetZaznamu." záznamů";
  header("Content-Description: File Transfer");
  header("Content-Type: text/txt");
  header("Content-Disposition: attachment;filename=\"info-".$tabulka.".txt\"");
echo $info;


?>
Pokud nechám hlavičky jen v části kontrolující velikost, ořízne se to na jeden cca megový soubor, tak jsem doufal že by to mohlo jít takhle, ale zdá se, že to nakonec vypíše vše do jednoho souboru... a to i bez toho konnce s textovým souborem.
Jan Tvrdík
Profil
VelkýBubák:
Jde nějak posílat z jednoho scriptu více xml souborů?
Ne, jedině, že bys to zabalil do archivu.
VelkýBubák
Profil
Jan Tvrdík:
myslíš jako jeden vytvořil, zabalil, a tvořil další?
juriad
Profil
Ne, vytvořil všechny, zabalil je (například do zipu) a zip nabídnul ke stažení.
VelkýBubák
Profil
juriad:
aha, takže pokud to dobře chápu, lze nějak udělat více souborů v jednom scriptu, ale pokud bych je chtěl i všechny z jednoho scriptu poslat, musím je zabalit.

Pokud vezmu v potaz ten script co už mám, proměnná $textík by se vkládala do nějaké balicí funkce, jež by to zabalila až po vytvoření poslední části (posledního souboru na zabalení), a za ní by ve scriptu zůstala jen jedna trojice hlaviček na konci, aby vytvořený archiv poslala.

Rozumím tomu správně?
juriad
Profil
Ano; podívej se na první příklad http://cz1.php.net/manual/en/zip.examples.php a také na http://us2.php.net/manual/en/ziparchive.open.php#84646
VelkýBubák
Profil
juriad:
Mnohokrát děkuji, pomohlo.
Vytvořil se zip archiv a uložil ke mně do adresáře.
Teď už jen zjistit, jak to nabídnout ke stažení jako původně ten xml soubor.
juriad
Profil
VelkýBubák:
To je v tom druhém odkazu :)
// Stream the file to the client
header("Content-Type: application/zip");
header("Content-Length: " . filesize($file));
header("Content-Disposition: attachment; filename=\"a_zip_file.zip\"");
readfile($file); 
VelkýBubák
Profil
juriad
Jau, toho jsem si nějak nevšiml.

Bohužel, toto mi nefunguje. Respektive, vyskočí okénko na stažení zip souboru s příponou xml o velikosti 20bajtů...

jako prozatimní řešení tam mám ma tvrdo danou cestu k vytvořenému souboru, ale stejně by mě zajímalo.
VelkýBubák
Profil
Opravdu nechápu.
Když ty dvě akce (tvorba souboru a automatická nabídka ke stažení) provedu ručně dvouma scriptama php kódu - lze to.
Když to dám dohromady - nelze.
-že by za to mohl nějaký buffer (viz [#14] Alphard)?

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: