2012-01-11 7 views
1

私はfopen()とbase64コミュニケーションについて質問があります。 シナリオは次のとおりです。私は、リソース(png/jpegまたはpdf)からURLを取得する必要があるサービスAを持っています。 B. Bサービスはこの文字列を取り、それを保存しようという名前の、別のPHPサービスへ:URLとバイトストリームにfopen

$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); 

は今、私はこの$のリターン(「iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs」のようなもの)を送信するjQueryの機能を持っている:コードは、ということですディスク上に。サービス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); 

しかし、保存されている画像が破損している、additionalsにこの画像やPDFが少ないバイトはその後、orginal持っています。 D

+0

旧式のファイル操作ではなく、 '$ imageninary = file_get_contents($ uri);'を実行できます。これはより読みやすくなり、あなたの問題を解決する(またはしない)かもしれません。 –

+0

ありがとう、私はすべて私のfopenを変更しますが、これは方法ではありません..他の提案? – Matte

答えて

2

私はこれが動作する100%わからないんだけど、戻ってバイナリにデータをBASE64_DECODEない理由を、一時ファイルにデータを書き込み、それからアマゾンに送る:

は、私は本当に助けを必要とロケーション。 (未テスト)のような何か:あなたはS3サーバ上のファイルを保存する場所

// 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は...あなただけの$ FILE_NAMEを使用することができますけれども。

+0

エラーはHTTPによって引き起こされます:base64文字列はサービスBに送信されるときにすべての+ charを失います。方法は、ベース64の文字列でurlencodedを呼び出し、fopen/file_get_contentsの前にurldecodeを呼び出します。 ありがとうございます – Matte

関連する問題