Dateien mit PHP zusammenfügen (wie copy /b bei DOS)
Eingetragen von tick313 (41)
am 16.01.2010 - 22:54 Uhr in
am 16.01.2010 - 22:54 Uhr in
Hallo zusammen,
ich möchte gerne per Code bestimmte Dateien zusammengefügt als eine Datei per Download anbieten.
Unter DOS wäre das der Befehl:
copy /b Datei_1 + Datei_2 + Datei_3 fertige_Datei
Ich habe nun eine PHP-Datei, mit der ich dies umsetzen kann:
header('Cache-control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: anytextexeptno-cache', true);
header('Content-type: application/force-download');
// header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: Binary');
header('Vary: User-Agent');
$Contentlength = filesize($file1) + filesize($file2) + mb_strlen( $configTxt, '8bit');
header("Content-length: $Contentlength");
header('Content-disposition: attachment; filename='.$downloadFilename);
readfile($file1);
echo $configTxt;
readfile($file2);
Wenn ich die PHP-Datei direkt aufrufe, funktioniert auch die heruntergeladene Datei.
Wenn ich den PHP-Code aber im Node eingebe, dann ist die heruntergeladene Datei nicht ausführbar, da die ersten Zeilen in der Datei mit HTML-Inhalt versehen sind.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...
Wie bekomme ich meine gewünschte Funktion am besten hin?
Grüße
tick313
- Anmelden oder Registrieren um Kommentare zu schreiben
Modul
am 17.01.2010 - 00:22 Uhr
Schreib Dir ein Modul, das unter einem bestimmten Pfad die entsprechenden Daten ausgibt.
Stefan
--
Sei nett zu Deinem Themer!
danek für die schnelle
am 17.01.2010 - 00:41 Uhr
danke für die schnelle Antwort.
Ja mein Wunsch ist ja ein (Block-)Modul zu entwerfen, in dem ich die gewünschte Funktion implementiere. Bin allerdings noch ein wenig in den Anfängen, und weiß leider nicht, wie ich das genau umsetzen soll. Hast Du einen Ansatz für mich? Mache ich das am besten mit fwrite()?
Grüße
tick313
<?php
am 19.01.2010 - 22:06 Uhr
<?php
header('Cache-control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: anytextexeptno-cache', true);
header('Content-type: application/force-download');
// header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: Binary');
header('Vary: User-Agent');
$Contentlength = filesize($file1) + filesize($file2) + mb_strlen( $configTxt, '8bit');
header("Content-length: $Contentlength");
header('Content-disposition: attachment; filename='.$downloadFilename);
readfile($file1);
echo $configTxt;
readfile($file2);
?>
Wenn du genau diesen Code in einem Page Callback einfügst, sollte dir beim Aufruf des Callbacks der gewünschte Download präsentiert werden.
Für das Einrichten eines Page Callbacks könnte http://api.drupal.org/api/drupal/developer--examples--page_example.module/6 hilfreich sein.
Hallo, vielen Dank für den
am 20.01.2010 - 02:26 Uhr
Hallo,
vielen Dank für den Tipp.
Wenn also jemand auf den Download-Button klickt, dann soll ein Page Callback mit dem genannten Inhalt aufgerufen werden?
Leider ist der Link, den Du mir gegeben hast tot. Welchen Code nutze ich für den Page Callback? In der Suchfunktion der API finde ich nichts.
Grüße
tick313
Page Callback
am 20.01.2010 - 10:23 Uhr
http://api.drupal.org/api/drupal/developer--examples--page_example.module/6
Der Link sollte jetzt aber funktionieren ;) Dort findest du ein Beispielmodul für die Einrichtung eines Page Callbacks.
Ja der Link hat
am 21.01.2010 - 02:25 Uhr
Ja der Link hat funktioniert. Vielen Dank.
Ich bin aber anscheinend leider etwas schwer von Begriff :-(
Folgendes Modul habe ich nun erstellt:
<?php
function page_test_baz() {
$configTxt = "....";
$file1="... ";
$file2="... ";
header('Cache-control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: anytextexeptno-cache', true);
header('Content-type: application/force-download');
// header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: Binary');
header('Vary: User-Agent');
$Contentlength = filesize($file1) + filesize($file2) + mb_strlen( $configTxt, '8bit');
header("Content-length: $Contentlength");
header('Content-disposition: attachment; filename='.$downloadFilename);
readfile($file1);
echo $configTxt;
readfile($file2);
}
?>
In einem node rufe ich dann die Funktion
page_test_baz();
auf.
Doch auch hier bekomme ich eine Datei, die zuerst mit dem HTML-Code anfängt. :-(
Was mache ich falsch?
Grüße
tick313
Hallo, sorry für uppen,
am 23.01.2010 - 22:49 Uhr
Hallo,
sorry für uppen, aber ich komme leider nicht weiter, und dieser Schritt ist sehr wichtig für das Projekt.
Wenn ich den Page recall mit meiner Funktion aufrufe, dann fängt der Inhalt der heruntergeladenen Datei so an:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="shortcut icon" href="/themes/sky/favicon.ico" type="image/x-icon" />
<title>testen | meineSeite.de</title>
<link type="text/css" rel="stylesheet" media="all" href="/sites/all/modules/admin_menu/admin_menu.css?l" />
...
Erst danach folgt der Inhalt von $file1.
Gibt es irgendeinen Trick um das zu umgehen?
Vielen Dank und viele Grüße
tick313
Hallo, zu deinem
am 24.01.2010 - 11:26 Uhr
Hallo,
zu deinem Page-Callback
page_test_baz()
benötigst du noch einen Menu-Eintrag imhook_menu()
. Angenommen, dein Modul heißtpage_test
, dann lautet der Eintrag wie folgt (der Code ist fast 1zu1 aus dem oben verlinkten Beispiel-Modul geklaut):<?php
function page_test_menu() {
$items['bar/baz'] = array(
'title' => 'Baz',
'page callback' => 'page_test_baz',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
?>
In deiner Node fügst du dann nicht direkt die Funktion
page_test_baz()
ein, sondern einen Link zum Menu-Eintrag: http://www.example.org/bar/baz oder http://www.example.org/?q=bar/bazBeim Aufruf des Links sollte dir die Datei zum Download angeboten werden.
Wichtig: Nach dem Anlegen eines neuen Menu-Eintrags muss der Drupal-Cache geleert werden: Verwalten -> Leistung -> Cache leeren
Grüße,
Benedikt
--
http://www.twitter.com/bspellmeyer
DANKE!
am 24.01.2010 - 14:27 Uhr
Super!!! Vielen vielen Dank.
Ich habe noch immer nicht die Denkweise mit den Hooks verinnerlicht. Zudem hatte ich mich nur auf die Funktion page_test_baz konzentriert, und übersehen, dass das ganze über einen neuen Menueintrag aufgerufen wird.
Jetzt muss ich nur noch verhindern, dass /bar/baz direkt von jedem aufgerufen werden kann, sondern nur, wenn man über den Link aus der vorherigen Seite klickt. Dann ist alles perfekt.
Viele Grüße
tick313