2013-11-22 5 views
2

Im загружает несколько изображений на мой холст, а затем после загрузки Я хочу нажать кнопку, которая сохраняет этот холст на моем сервере. Я вижу, что скрипт работает нормально, пока не дойдет до части «toDataURL», и моя функция перестанет выполняться. Что я делаю не так? Вот мой код:Как сохранить html5 canvas на сервер

<!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); 
} 
?> 

Я получаю ошибку безопасности, хотя.

+0

Вы используете это на локальном хосте или другом сервере? Просто спрашиваю. – Atutouato

ответ

1

В the specification for the canvas element говорится:

Information leakage can occur if scripts from one origin can access information (e.g. read pixels) from images from another origin (one that isn't the same).

To mitigate this, bitmaps used with canvas elements are defined to have a flag indicating whether they are origin-clean. All bitmaps start with their origin-clean set to true. The flag is set to false when cross-origin images or fonts are used.

The toDataURL(), toDataURLHD(), toBlob(), getImageData(), and getImageDataHD() methods check the flag and will throw a SecurityError exception rather than leak cross-origin data.

The flag can be reset in certain situations; for example, when a CanvasRenderingContext2D is bound to a new canvas, the bitmap is cleared and its flag reset.

Поскольку вы загружаете изображения с другого сервера в брезентовый элемент, работа вокруг, чтобы иметь возможность использовать toDataURL() является «копией» холст в новый элемент холста, чтобы сбросить флаг «Исходный чистый» на «true».

Вы можете увидеть пример этого here

+0

нормально, но даже когда я делаю это, он все еще не работает ... png по умолчанию в любом случае прав? Можете ли вы придумать что-нибудь еще? – james

+0

@james Что вы подразумеваете под словом "not working"? Какая у вас ошибка? –

+0

хорошо, я не думаю, что он проходит через эту строку toDataUrl, потому что, когда я помещаю предупреждение, после этого он не появляется. Я не думаю, что скрипт делает это на php-страницу. У меня есть сценарий saveCards.php, который сохраняет его в папку на моем сервере, но изображение не отображается. – james

0

я вычислял, что я сделал неправильно, но на самом деле не знаю, почему он сейчас работает. В моем фактическом коде, который я использую вместо images/image.png, я использовал полный url https://www.mywebsite.com/images/image.png По какой-то причине, когда я просто пишу сокращенные изображения/image.png. Он работает нормально. Благодарим вас за всю отладочную помощь и за альтернативные решения.

+0

Итак, все изображения с моего собственного сайта, поэтому, если кто-нибудь знает, почему использование полного URL-адреса дает ошибку безопасности, объясните, пожалуйста. – james