2011-07-15 6 views
2

ブロブから画像ファイルに書き込もうとしています。PHPから画像ファイルに書き込む際にエラーが発生しました

if($_POST['logoFilename'] != 'undefined'){ 
    $logoFile = fopen($_POST['logoFilename'], 'w') or die ("Cannot create ".$_POST['logoFilename']); 

    fwrite($logoFile, $_POST['logoImage']); 

    fclose($logoFile); 
} 

前のコードスニペットでは、$_POST['logoImage']はBLOBです。ファイルはルートディレクトリに正しく書き込まれますが、ファイルを開くことはできません。 Ubuntuの11.04で、私は次のエラーが表示されます

Error interpreting JPEG image file (Not a JPEG file: starts with 0x64 0x61). 

私はIMGを作成し、以下に含ま

はBLOBの最初のスニペットでそのSRC =ブロブを設定した場合、BLOBが正しく表示されない:

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAgGBgcGBQgHBwcJCQ 
+0

'$ _POST [ 'logoImageどのように'] 'BLOB? POST経由でアップロードされた場合、ファイルは '$ _POST'ではなく' $ _FILES'で終わるはずです。 –

+0

ajax経由の$ _POSTは、フォーム送信ではありません。 – GAgnew

答えて

7

は本当にData URI次のとおりです。

data:[<MIME-type>][;charset=<encoding>][;base64],<data> 

だけデコードされたデータの一部をしたいので、あなたが

file_put_contents(
    'image.jpg', 
    base64_decode( 
     str_replace('data:image/jpeg;base64,', '', $blob) 
    ) 
); 

をしなければならない。しかしPHPは、ネイティブデータをサポートするので://ストリームを、あなたすることもできます(ありがとう@NikiC)

file_put_contents('image.jpg', file_get_contents($blob)); 

上記の場合RK、あなたはGDlibで試すことができます。

imagejpg(
    imagecreatefromstring(
     base64_decode( 
      str_replace('data:image/jpeg;base64,', '', $blob) 
     ) 
    ), 
    'image.jpg' 
); 
+0

@GregHmm、転送中に画像が壊れていないことを確認してください。 $ blogの内容は '=='で終わりますか? – Gordon

+0

これは '/ 9k ='で終わりますが、これはimgオブジェクトのJavascriptによって正しくレンダリングされるときに終了するのと同じ方法です。 – GAgnew

+0

@Gregそれは秘密ですか?http://pastebin.comにデータuriを置くことはできますか?同じ結果が得られたら、試してみたいです。 – Gordon

0

ファイルアップロードコントロールの場合、 $_POSTには情報が含まれません。あなたは handling file uploads$_FILESを探しています。 (より具体的には、 move_uploaded_file

が新しいアップデートを考えると、次のことを試してください。

// 
    // Export a image blob to a file using either the specific image name 
    // @blob  : The actual image blob 
    // @fileName : Can be the explicit name (with an extension) or this can be 
    //    just a generic file name and the extension (based on data 
    //    type) will be appended automatically. This can also include 
    //    path information. 
    // Exmaples: 
    // storeBlob('data:image/png;base64,...', 'myimage');  :: saves as myimage.png 
    // storeBlob('data:image/jpg;base64,...', 'img/new.jpg'); :: saves as img/new.jpg 
    function storeBlob($blob, $fileName) 
    { 
    $blobRE = '/^data:((\w+)\/(\w+));base64,(.*)$/'; 
    if (preg_match($blobRE, $blob, $m)) 
    { 
     $imageName = (preg_match('/\.\w{2,4}$/', $fileName) ? $fileName : sprintf('%s.%s', $fileName, $m[3])); 

     return file_put_contents($imageName,base64_decode($m[4])); 
    } 
    return false; // error 
    } 
+0

これはfileUploadコントロールからのものですが、フォーム送信ではありません。生の文字列ブロブとしてAJAXを介して提出されます。 – GAgnew

+0

@Greg:私の知る限り、ajaxはファイルのアップロードをサポートしていません。サイトでは通常、バイナリデータをアップロードする機能を持つ別のツール(FlashやActiveXオブジェクトなど)を使用します。しかし、私はあなたに興味のある[ajaxファイルのアップロードに関する記事](http://www.anyexample.com/programming/php/php_ajax_example__asynchronous_file_upload.xml)を見ました。 –

+1

合意。このデータが珍しいクライアントから来ていないかぎり(Flashサービスの一部、またはWebサービスとしてこのサービスを呼び出す別のサーバーのサーバー側コード)、非常に奇妙なものです。バニラWebブラウザを使用して、ユーザーのファイルシステムからPOST変数にデータを取得する方法はありません。 – timdev

0

それは本当にブロブだ場合、あなたはあなたの2番目のパラメータとして「WB」モードを使用しようとする場合がありますfopen()呼び出し。

EDIT:バイナリセーフであるfile_put_contents()を使用することもできます。あなたの"Blob"

0

この機能は、ファイルにデータのURIが保存されます:あなたのケースで

function saveDataUri($blob, $filename = null) 
{ 

    // generate unique name basing on content 
    if (empty($filename)) { 
     $filename = md5($blob); 
    } 

    // parse data URI 
    $semiPos = strpos($blob, ';', 5); 
    $comaPos = strpos($blob, ',', 5); 
    $mime = substr($blob, 5, $semiPos - 5); 
    $data = substr($blob, $comaPos + 1); 

    $isEncoded = strpos(substr($blob, $semiPos, $comaPos), 'base64'); 

    if ($isEncoded) { 
     $data = base64_decode($data); 
    } 


    // save image data to file 
    switch ($mime) { 
      case 'image/png': 
       $ext = 'png'; 
      break; 
      case 'image/gif': 
       $ext = 'gif'; 
       break; 
      case 'image/jpg': 
      case 'image/jpeg': 
      default: 
       $ext = 'jpg'; 
       break; 
    } 

    $outFile = $filename . '.' . $ext; 
    $funcName = 'image' . $ext; 
    $result = $funcName(imagecreatefromstring($data), $outFile); 

    if ($result) { 

     return $outFile; 
    } 

    return $result; 
} 

使用法:

// some_validation($_POST); 
$filename = saveDataUri($_POST['logoImage']); 
echo '<img src="' . $filename . '" alt="' . $filename . '" />'; 
関連する問題