如何将Canvas标签中的图像保存到PHP服务器?

4
我有一个像这样的javascript代码:
var testCanvas = document.getElementById('canvas-1');
var canvasData = testCanvas.toDataURL("image/png");
var ajax = new XMLHttpRequest();
ajax.open("POST",'http://www.domain.com/imgsave.php',true);
ajax.setRequestHeader('Content-Type', 'canvas/upload');
ajax.send("canvasData"+canvasData );

我的php代码如下:
if (isset($GLOBALS["HTTP_RAW_POST_DATA"]))
{
    // Get the data
    $imageData=$GLOBALS['HTTP_RAW_POST_DATA'];

    $filteredData=substr($imageData, strpos($imageData, ",")+1);

    $unencodedData=base64_decode($filteredData);
    $fp = fopen( 'test.png', 'wb' );
    fwrite( $fp, $unencodedData);
    fclose( $fp );
        echo "saved";
}
  else{

  echo "no raw data";
  }

执行此代码时,我得到了一个大小为零的PNG文件图像?我的代码有什么问题?

2
当然,您检查了$unencodedData不为空,对吧? - dfsq
3个回答

6

最近我也不得不这样做。

首先,我将我的canvasData放入一个隐藏字段中,并将其发布到我的PHP页面。

它以以下格式返回:data:image/png;base64,iVBORw0......

您需要先拆分数据,因为data:image/png;base64,是头信息。其余部分是编码数据。

$rawData = $_POST['imageData'];
$filteredData = explode(',', $rawData);

$unencoded = base64_decode($filteredData[1]);

然后我在我的服务器上创建图像:

//Create the image 
$fp = fopen('sigs/test1.png', 'w');
fwrite($fp, $unencoded);
fclose($fp); 

然后读取它并根据我的意愿进行操作。
$file_name = 'test1.png';
$file_size = strlen($filteredData[1])/1024; //This may be wrong, doesn't seem to break for me though.


$fh = fopen('sigs/test1.png', 'r');
$content = fread($fh, $file_size);
$content = base64_encode($content);
fclose($fh);

我相信有更加优雅的解决方案,但这个方法对我很有效!请查看以下链接获取更多信息(可能):我的问题

2

以下是我通过ajax从画布中保存图像的方法。我在客户端使用jQuery。

 jQuery.ajax({
     url: 'save.php',
     type: 'POST',
     data: {
         data: c.toDataURL('image/png')
     },
     complete: function(data, status)
     {
         if(status=='success')
         {
            alert('saved!');
         }
         alert('Error has been occurred');
     }

 });

php:

    $based64Image=substr($_POST['data'], strpos($_POST['data'], ',')+1);

    $image = imagecreatefromstring(base64_decode($based64Image));

    $fileName='';
    if($image != false)
    {
        $fileName=time().'.png';
        if(!imagepng($image, $fileName))
        {
//          fail;
        }
    }
    else
    {
//          fail;
    }

我希望这能有所帮助。

0
根据手册中的注释,要获取HTTP_RAW_POST_DATA,您需要执行以下操作:
<?php $postdata = file_get_contents("php://input"); ?> 

手册中关于像php://input这样的包装器的解释如下:

对于POST请求,最好使用php://input而不是$HTTP_RAW_POST_DATA,因为它不依赖于特殊的php.ini指令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接