Bytes einer Datei während Download ändern

DeeFour

Mitglied
hi,

kann mir jemand sagen wie man Bytes z.B. einer MP3 Datei während des Downloads ändern kann?

Ich habe einen Musik Promotion Pool und muß z.B. während eines Downloads ID3 Tags ändern und die einzig sinnvolle Methode ist es das Ganze während des Dateidownloads zu tun.

Momentan erzwinge ich den DateiDownload so:

PHP:
header("Content-type: application/octet-stream");
header("Pragma: hack"); // WTF? oh well, it works...
header("Content-Length: ".(string)(filesize("../".$pfad."/".$filename)) );
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Transfer-Encoding: binary\n");

readfile("../".$pfad."/".$filename);	// Datei einlesen und ausgeben

Ich hoffe mir kann einer von euch bei der Sache weiterhelfen.

ich vermute ich muß anstelle von readfile das Ganze irgendwie mit fopen() handeln, aber ich bin mir nicht sich wie das in dem Fall geht.
 
Du müsstest die Datei sequenziell auslesen, parsen und an gegebener Stelle verändert wieder ausgeben. Also quasi:
PHP:
$fd = fopen("../".$pfad."/".$filename);
if ($fd !== false) {
	$length = 1024;
	while ($buffer = fread($fd, $length)) {
		// ID3-Daten aus $buffer parsen und gegebenenfalls verändern
		echo $buffer;
		if ($endOfId3) {
			break;
		}
	}
	fpassthru($fd);
}
Die Gesamtlänge der Daten kannst du möglicherweise schon vorher berechnen. Oder du pufferst die Daten bis nach der Änderung der ID3-Tags und gibst die Gesamtlänge erst später an.
 
Hi Markus,

schonmal danke für die Antwort.

Sowas in der Art hatte ich mir jetzt auch schon ausgeknobelt. Problem ist nur, wenn ich Blockweise auslese und ein Block genau in einem ID3 Tag endet und im nächsten erst weitergeht.

Das könnte man zwar dadurch beheben, wenn ich erstmal alles buffer, aber dann hab ich wieder das Problem das der Speicher zu voll wird. Es handelt sich in der Regel um ca. 13-15 MB große MP3 Files.

Aber evtl. muß ich garnicht die ID3 modifizieren und es reicht ein paar Bytes an einer Stelle in der Datei zu ändern ohne das man das groß hört. Ich würde da dann z.B. die UserID aus meinem Promo Pool speichern.

was genau macht das fpassthrough? Die Beschreibung bei php.net hab ich nicht so ganz verstanden.
 
Zurück