2017-09-19 9 views
0

サーバー側に有効な画像ファイルを作成するPHPスクリプトがあります。次のコードは正常に動作:PHPで文字列を画像に変換する

$filename = $_GET['filename']; 

// Only proceed if we got valid input 
if ($filename !== null) { 
    echo "$filename is not null."; 
    $image = @imagecreatetruecolor(10, 10) 
       or die('Cannot Initialize new GD image stream'); 

    if (strpos($image, '/gif') !== false) { 
     $image_type = "GIF"; 
     header('Content-Type: image/gif'); 
     $successful = imagegif($image, "./$filename"); 
    } else if (strpos($image, '/jpeg') !== false) { 
     $image_type = "JPG"; 
     header('Content-Type: image/jpeg'); 
     $successful = imagejpeg($image, "./$filename"); 
    } else if (strpos($image, '/png') !== false) { 
     $image_type = "PNG"; 
     header('Content-Type: image/png'); 
     $successful = imagepng($image, "./$filename"); 
    } 

    if ($successful) { 
     echo "Image written to '$filename'."; 
    } else { 
     echo "Could not write $image_type image to '$filename'."; 
    } 
    imagedestroy($image); 
    echo "image destroyed."; 
} else { 
    echo "$filename is null."; 
} 

これは、$ファイル名と&精細な画像が作成され動作します。しかし、実際には、ファイル名だけでなく画像も受信する必要があります。だから、私はから作成することができますどのように実際のコードは

$filename = $_GET['filename']; 

$image = $_GET['image']; 

echo "file $filename = '$image'."; 

// Only proceed if we got valid input 
if ($filename !== null) { 
    echo "$filename is not null."; 

    if (strpos($image, '/gif') !== false) { 
     $image_type = "GIF"; 
     header('Content-Type: image/gif'); 
     $successful = imagegif($image, "./$filename"); 
    } else if (strpos($image, '/jpeg') !== false) { 
     $image_type = "JPG"; 
     header('Content-Type: image/jpeg'); 
     $successful = imagejpeg($image, "./$filename"); 
    } else if (strpos($image, '/png') !== false) { 
     $image_type = "PNG"; 
     header('Content-Type: image/png'); 
     $successful = imagepng($image, "./$filename"); 
    } 

    if ($successful) { 
     echo "Image written to '$filename'."; 
    } else { 
     echo "Could not write $image_type image to '$filename'."; 
    } 
    imagedestroy($image); 
    echo "image destroyed."; 
} else { 
    echo "$filename is null."; 
} 

これは動作しませんが、結果は

file t.png = 'data:image/jpeg;base64,/9j/4AAQSkZJ … qA/Cz//Z'.t.png is not null.Image written to 't.png'.image destroyed. 

です「データ:画像/ JPEGを...」文字列がPHPで有効なイメージ?

EDIT 1:それはanother questionの可能重複しないことを確認するために上記のコード1つの行を追加:

// Only proceed if we got valid input 
if ($filename !== null) { 
    echo "$filename is not null."; 
    $image = base64_decode($image); // <<<< 

EDIT 2:ファイルであるように、私は、コードを改変削除済み:

$filename = $_GET['filename']; 

$image = $_GET['image']; 

// Only proceed if we got valid input 
if ($filename !== null) { 
    echo "$filename is not null."; 
    $image = base64_decode($image); 
    $slash1 = strpos($image, '/'); 

    $image_type = substr($image, $slash1, strpos($image, ';') - $slash1); 

    if (file_exists($filename)) unlink($filename); 

    header('Content-Type: image/' . $image_type); 

    switch ($image_type) { 
     case "gif": 
      $successful = imagegif($image, "./$filename"); 
      break; 
     case "jpeg": 
     case "jpg": 
      $successful = imagejpeg($image, "./$filename"); 
      break; 
     case "png": 
      $successful = imagepng($image, "./$filename"); 
      break; 
    } 

    if ($successful) { 
     echo "Image written to '$filename'."; 
    } else { 
     echo "Could not write $image_type image to '$filename'."; 
    } 
    imagedestroy($image); 
    echo "image destroyed."; 
} else { 
    echo "$filename is null."; 
} 

でも、回答はCould not write image to 't.jpg'です。

EDIT 3:これは、私は2つのパラメータに渡すものです:

?filename=t.jpg&image=data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/7AARRHVja3kAAQAEAAAAPAAA/+0ALFBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAAP/bAEMAAgEBAgEBAgICAgICAgIDBQMDAwMDBgQEAwUHBgcHBwYHBwgJCwkICAoIBwcKDQoKCwwMDAwHCQ4PDQwOCwwMDP/bAEMBAgICAwMDBgMDBgwIBwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAAEAAQMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APA6KKK/qA/Cz//Z 

EDIT 4:は、@ delboy1978ukの提案に応じてコードを修正しました。

$filename = $_GET['filename']; 

$image = $_GET['image']; 

echo "file $filename = '$image'."; 

// Only proceed if we got valid input 
if ($filename !== null) { 
    $slash = strpos($image, '/') + 1; 

    $image_type = substr($image, $slash, strpos($image, ';') - $slash); 
    $comma = strpos($image, ',') + 1; 

    $image = substr($image, $comma); 

    $decoded_image = base64_decode($image); 

    $image = imagecreatefromstring($decoded_image); 

    echo "The image type is '$image_type'."; 

    if (file_exists($filename)) { 
     unlink($filename); 
     echo "Deleted file '$filename'."; 
    } 

    header('Content-Type: image/' . $image_type); 
    $filename .= '.' . $image_type; 

    switch ($image_type) { 
     case "gif": 
      $successful = imagegif($image, "./$filename"); 
      break; 
     case "jpeg": 
     case "jpg": 
      $successful = imagejpeg($image, "./$filename"); 
      break; 
     case "png": 
      $successful = imagepng($image, "./$filename"); 
      break; 
    } 

    if ($successful) { 
     echo "Image written to '$filename'."; 
    } else { 
     echo "Could not write $image_type image to '$filename'."; 
    } 

    if (imagedestroy($image) === true) { 
     echo "Image destroyed."; 
    } 
} else { 
    echo "$filename is null."; 
} 
+0

が重複する可能性が。com/questions/4672392/create-image-from-data-url) – iainn

答えて

0

問題は解決されました!ここには、ブラウザでキャッシュされた画像&が要求されたサーバーの場所に送信されるコードがあります。サーバーからイメージを取得すると、同じイメージになります。最初のJavaScriptコード:興味のある方のために

[…] 
var parameters = { 
    […], 
    headerImageLocation: '', 
    image: new Image(), 
    […], 
}; 

if (strings.hasMinimalLength(blobURL, 9)) { 
    this.getBlobFromURL(blobURL).then(this.fromBlobToBase64).then(function(result) { 
     parameters['image'].src = result; 
     parameters['headerImageLocation'] = './' + strings.generateID(); 

     server.continueWithNewsTicker(parameters); 
    }); 
} else { 
    this.continueWithNewsTicker(parameters); 
} 

// Prototype "MainServer": 
MainServer.method('continueWithNewsTicker', function(parameters) { 
    var url = server.ServiceTest + 'saveHeaderImage.php'; 

    if (strings.hasMinimalLength(parameters['headerImageLocation'], 1)) { 
     var formData = new FormData(); 

     formData.append('filename', parameters['headerImageLocation']); 
     formData.append('image', parameters['image'].src); 

     this.uploadFile(formData, url); 
    } 
    […] 
}); 

// Prototype "Server": 
Server.method('uploadFile', function (data, url) { 
    var xhr = new XMLHttpRequest(); // AJAX request 

    xhr.open('POST', url); 
    xhr.send(data); 
}); 

// Prototype "Strings": 
Strings.method('generateID', function() { 
    function s4() { 
     return Math.floor((1 + Math.random())*0x10000) 
      .toString(16) 
      .substring(1); 
    } 
    return s4() + s4() + '-' + s4() + '-' + s4() + '-' + 
     s4() + '-' + s4() + s4() + s4(); 
}); 

は、PHPコードは次のとおりです。// stackoverflowの:(HTTPS [データURLからイメージを作成]の

​​
1

あなたはすでにへの出力を送信したページのヘッダーを送信しようとしている。また、常に画像の種類に対応している必要がありとして渡さファイル名は、画像ファイルの拡張子が含まれていることを正しくありません。

ファイルからロードする場合は、imagecreatefromjpeg()と同等のGIFおよびPNGを使用する必要があります。 http://php.net/manual/en/function.imagecreatefromjpeg.php

$img = imagecreatefromjpeg($file); 

、実際の文字列データは文字通りあなたの<image>タグにエコーしてもらう出力バッファリングを使用するには:

ob_start(); 
imagejpeg($img) 
$image = ob_get_clean(); 
echo '<img src="data:image/jpeg;base64,' . base64_encode($i).'" />'; 

興味のある方は、私がこれを処理し、その数年前にImageクラスを作りましたものは、ここをクリックhttps://github.com/delboy1978uk/image/blob/master/src/Image.phpとそれに関するブログhttps://delboy1978uk.wordpress.com/2014/12/01/outputting-images-as-base64-encoded-strings/

+0

ありがとうございます!しかし、 'imagecreatefromjpeg'は、実行するイメージファイルのファイル名が必要です。サーバーディスク上にファイルを作成するはずのGETリクエストでテキストデータを送信しています。私。クライアント側で作成したファイルをサーバー側に複製したい。 – Sae1962

+0

ああ、私は第2部であなたが開くためのファイル名を送信していると思った!その場合、ファイルがすでに存在する場合は失敗しているように見えますか? 'file_exists()'を試してください。それがあれば削除してください。 – delboy1978uk

+0

コードを修正しましたが、ファイルが作成されていないため、何か問題があります。 – Sae1962

関連する問題