2012-01-11 3 views
1

У меня есть вопрос о fopen() и base64 связи. Сценарий таков: у меня есть служба A, которая должна извлекать из url ресурс (png/jpeg или pdf). Код является то, что:fopen на url и bytestream

$uri = urldecode($_POST['uri']); 
    $imgfile = $uri; 
    $handle = fopen($uri, 'r'); 
    $imagebinary = ''; 

    while (!feof($handle)) { 
     $c = fgetc($handle); 
     if($c === false) break; 
     $imagebinary .= $c; 
    } 
    fclose($handle); 
    $return = base64_encode($imagebinary); 

Теперь у меня есть функция JQuery, отправляющая это $ возвращения (что-то вроде этого: «iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs») в другой PHP службу, названный Б. B сервиса взять эту строку и попытаться сохранить его на диске. В конкретных услуга В попытке сохранить файл на Амазонке s3, код является то, что:

// in $imagedata is saved the string generated by service A 
    $imagedata = $_POST['serviceA_base64encodedfile']; 
    // $contentType taken from switch function on $ext 
    // for example 'image/png' 
    $filename = sha1(uniqid()) . '.' . $ext; 
    $full_filename = $path . '/' . $filename; 

    $stream = fopen('data://' . $contentType . ';base64,' . $imagedata, 'r'); 
    fseek($stream, 0); 

    $opt = array(
     'fileUpload' => $stream, 
     'acl' => AmazonS3::ACL_PUBLIC, 
     'contentType' => $contentType 
    ); 

    $s3 = new AmazonS3(AWS_KEY, AWS_SECRET_KEY); 
    $response = $s3->create_object($bucket, $filename, $opt); 

Но образ, который спасаемых поврежден, в это изображения Вспомогательные или PDF имеют меньше байт, то оригинал.

мне нужна помощь НАСТОЯЩЕМУ: D

+0

Вы можете сделать '$ imageninary = file_get_contents ($ uri);' вместо выполнения файлов старой школы. Это будет более читаемым и может (или не может) решить вашу проблему. –

+0

спасибо, я меняю все свои fopen, но это не так .. любые другие предложения? – Matte

ответ

2

Я не 100% уверен, что это будет работать, но почему бы не base64_decode данные обратно в двоичную, а затем записать данные во временный файл и отправить его в Амазонке от место нахождения. Что-то вроде (непроверенные):

// in $imagedata is saved the string generated by service A 
    $imagedata = base64_decode($_POST['serviceA_base64encodedfile']); 
    if (!$imagedata){ 
     //Handle invalid base64 encoded data 
    } 
    // $contentType taken from switch function on $ext 
    // for example 'image/png' 
    $filename = sha1(uniqid()) . '.' . $ext; 
    $full_filename = $path . '/' . $filename; 

    $tmpfname = tempnam("/tmp", "image_to_upload"); 
    $populated = file_put_contents($tmpfname,$imagedata); 
    if (!$populated){ 
     //handle write failures 
    } 

    $opt = array(
     'fileUpload' => "/tmp/".$tmpfname, 
     'acl'   => AmazonS3::ACL_PUBLIC, 
     'contentType' => $contentType 
    ); 

    $s3 = new AmazonS3(AWS_KEY, AWS_SECRET_KEY); 
    $response = $s3->create_object($bucket, $full_filename, $opt); 

Я также предполагаю на последний звонок, что $ full_filename где вы хотите сохранить файл на сервере s3 ... хотя вы можете просто использовать $ имя_файла.

+0

Ошибка вызвана HTTP: строка base64 потеряла все + char, когда она отправляется на службу B. Способ вызова urlencoded на основе base64 и urldecode перед fopen/file_get_contents. Спасибо всем! – Matte

Смежные вопросы