簡體   English   中英

如何將html5 canvas保存到服務器

[英]how to save html5 canvas to server

我將一些圖像加載到畫布上,然后在加載之后,我想單擊一個按鈕,將畫布圖像保存到我的服務器上。 我可以看到腳本運行良好,直到到達“ toDataURL”部分並且函數停止執行。 我究竟做錯了什么? 這是我的代碼:

<!DOCTYPE HTML>
<html>
  <head>
  <style>
    body {
    margin: 0px;
    padding: 0px;
   }
  </style>
</head>
<body>
<canvas id="myCanvas" width="578" 

height="200"></canvas>

<div>
<button onClick="saveCards();">Save</button>
</div>

<script>
  function loadImages(sources, callback) 

{
    var images = {};
    var loadedImages = 0;
    var numImages = 0;
    // get num of sources
    for(var src in sources) {
      numImages++;
    }
    for(var src in sources) {
      images[src] = new Image();
      images[src].onload = function() {
        if(++loadedImages >= numImages) 

{
          callback(images);

        }
      };
      images[src].src = sources[src];

    }

  }

  var canvas = 

document.getElementById('myCanvas');
  var context = canvas.getContext('2d');

  var sources = {
    great: 

'images/great.jpg',
    star: 

'images/1Star.jpg',  good: 

'images/good.jpg'
  };

  loadImages(sources, function(images) {
    context.drawImage(images.great, 

0, 0, 80, 120);
    context.drawImage(images.star, 80, 

0, 80, 120);
context.drawImage(images.good, 160, 0, 80, 

120);
  });

</script>

<script type="text/javascript">
function saveCards()
{
var canvas= 
document.getElementById("myCanvas");
alert("stops");
var theString= canvas.toDataURL();

var postData= "CanvasData="+theString;
var ajax= new XMLHttpRequest();
ajax.open("POST", 'saveCards.php', true);
ajax.setRequestHeader('Content-Type', 

'canvas/upload');

ajax.onreadystatechange=function()
{

if(ajax.readyState == 4)
{
alert("image was saved");
}else{
alert("image was not saved");
}
}

ajax.send(postData);
}
</script>

</body>
</html>

謝謝您的幫助,因為在調用toDataUrl之前未加載圖像? 如果可以,請您幫我解決。

這是PHP腳本:

 <?php
if(isset($GLOBALS['HTTP_RAW_POST_DATA']));
{

$rawImage=$GLOBALS['HTTP_RAW_POST_DATA'];
$removeHeaders= 

substr($rawImage,strpos($rawImage, ",")+1);
$decode=base64_decode($removeHeaders);
$fopen= fopen('images/image.png', 'wb');
fwrite($fopen, $decode);
fclose($fopen);
}
?>

我雖然遇到安全錯誤。

canvas元素的規范中,它指出:

如果來自一個來源的腳本可以訪問來自另一個來源(不相同)的圖像中的信息(例如,讀取像素),則可能發生信息泄漏。

為了減輕這種情況,畫布元素使用的位圖被定義為具有指示其是否為原始位置的標志。 所有位圖均以其origin-clean設置為true開頭。 使用跨域圖像或字體時,該標志設置為false。

toDataURL(),toDataURLHD(),toBlob(),getImageDataHD()和getImageDataHD()方法將檢查該標志,並將拋出SecurityError異常,而不是泄漏跨域數據。

在某些情況下可以重置該標志; 例如,當CanvasRenderingContext2D綁定到新畫布時,將清除位圖並將其標志重置。

由於要將圖像從其他服務器加載到canvas元素中,因此能夠使用toDataURL()的變通辦法是將畫布“復制”到新的canvas元素中,以將origin-clean標志重置為“ true”。

你可以在這里看到一個例子

我發現我做錯了什么,但不確定為什么現在可以工作。 在我使用的實際代碼中,我使用的是完整網址https://www.mywebsite.com/images/image.png,而不是images / image.png出於某種原因,我只寫了縮短的images / image.png 。 工作正常。 感謝您提供的所有調試幫助和替代解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM