Cześć,
Słuchajcie, do zrobienia mam skrypt który pobiera mi pliki mp3 z danego URL-a. Problem jest jednak taki, że nie mogę do tego wykorzystać standardowo nagłówków + readfile, tylko muszę jeszcze wykonać zapytanie z paroma ciasteczkami. Dlatego też wykorzystałem do tego Http Request2. Wszystko działa super, jednak gdy odpalam track po pobraniu, to jego jakość jest fatalna - tak jakby gubił połowę danych.
TrackPeer.php - model, który odpowiada za inicjowanie downloadu
static public function doInitDownload
($track) {
include 'HTTP/Request2.php';
include 'frontend/libs/tracks/observer.php';
$url = sprintf('someTrackUrl/%s/...' , $track->getTrackRemoteId());
$request = new HTTP_Request2($url);
$request->setConfig(array( 'follow_redirects' => true,
'store_body' => false
));
$response = $request->send();
foreach ($response->getCookies() as $arCookie) {
$request->addCookie($arCookie['name'], $arCookie['value']);
}
$request->attach(new HttpRequestTracksObserver());
Download::getRequestHeaders($track->getTrackTitle() . '.mp3', null, 'audio/x-mp3');
$request->send();
}
Funkcja Download::getRequestHeaders():
static public function getRequestHeaders
($title = '', $size = NULL, $mime = 'application/octet-stream') {
header('Content-Description: File Transfer'); header('Content-Type: ' . $mime);
if ($size)
{
header('Content-Length: ' . $size); }
header('Content-Disposition: attachment; filename=' . $title); header('Content-Transfer-Encoding: binary'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); }
Teraz najważniejsza rzecz, czyli klasa HttpRequestTracksObserver:
<?php
class HttpRequestTracksObserver implements SplObserver
{
public function update(SplSubject $subject)
{
$event = $subject->getLastEvent();
switch ($event['name'])
{
case 'receivedBodyPart':
case 'receivedEncodedBodyPart':
break;
}
}
}
Jeżeli ktoś ma w tym doświadczenie i wie, dlaczego tak się dzieje, to bardzo proszę o pomoc.
Dzięki,
Mateusz.
=== EDIT ===
Już ogarnąłem ! Warto wykorzystać jednak readfile() + stream_context_create() !
static public function doInitDownload
($track) {
include 'HTTP/Request2.php';
$url = '... mp3 path';
$request = new HTTP_Request2($url);
$request->setConfig(array( 'follow_redirects' => true,
'store_body' => false
));
$response = $request->send();
$session = end($response->getCookies());
'header' => 'Cookie: session=' . $session['value']
)
);
Download
::remote($url, $track->getTrackTitle() . '.mp3', (substr($track->getTrackSize(), 0, -3) * 1024 * 1024), 'audio/x-mp3', $opts); }
static public function Remote
($url, $title = '', $size = NULL, $mime = 'application/octet-stream', $opts = array()) {
$title = $title ?
$title : basename($url);
header('Content-Description: File Transfer'); header('Content-Type: ' . $mime);
if ($size)
{
header('Content-Length: ' . $size); }
header('Content-Disposition: attachment; filename=' . $title); header('Content-Transfer-Encoding: binary'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
if ($opts)
{
}else{
}
}
Mam nadzieję, że komuś się przyda (IMG:
style_emoticons/default/biggrin.gif)
Ten post edytował matix 26.05.2011, 10:19:01