2012-01-11 50 views
1

我有一个关于fopen()和base64通信的问题。 这种情况是:我有一个服务A,必须从url中获取资源(png/jpeg或pdf)。该代码是:打开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); 

现在我有发送此$回报(类似的东西:“iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs”)jQuery函数到另一个PHP服务,命名为B. 乙方服务利用这个字符串并尝试将其保存在磁盘上。在具体服务B试图保存在Amazon 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具有较少的字节,然后原单。

我真的需要帮助:d

+0

你可以做'$ imageninary = file_get_contents($ uri);'而不是做旧式的文件操作。这将更具可读性,可能(或不可能)解决您的问题。 – 2012-01-11 14:43:32

+0

谢谢,我改变了所有我的fopen,但这不是方式..任何其他建议? – Matte 2012-01-11 15:06:29

回答

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服务器上的文件......虽然你可以使用$ FILE_NAME。

+0

错误是由HTTP引起的:base64字符串在发送到服务B时丢失了所有的+ char。方式是在基于64的字符串上调用urlencoded,在fopen/file_get_contents之前调用urldecode。 感谢所有 – Matte 2012-01-12 08:33:19