2014-05-04 12 views
5

PHP'de tuval resminin kaydedilmesiyle ilgili bir sorunum var. Boş bir .png dosya alıyorum. Bu sorun hakkında çok fazla araştırma yapıyorum ama bu konuda yararlı bir şey bulamıyorum. Gerçek görüntüyü oluşturmak yerine neden boş bir görüntü kaydediyor?Tuval resmi sunucu tarafı kaydederken, bir base64 veri dizesinden, boş görüntü üretiyor

JavaScript kodu:

html2canvas([document.getElementById('dadycool')], { 
    onrendered: function (canvas) { 
     var data = canvas.toDataURL(); 
     var image = new Image(); 
     image.src = data; 
     document.getElementById('imagec').appendChild(image); 
     console.log(data); 
     $.ajax({ 
    type: "POST", 
    url: "up.php", 
    data: { 
    imgBase64: data 
    } 
}).done(function(o) { 
    console.log('saved'); 
}); 
} 

PHP kodu:

<?php 
// requires php5 
define('localhost/samp/sample2/uploads', 'images/'); 
$img = $_POST['imgBase64']; 
$img = str_replace('data:image/png;base64,', '', $img); 
$img = str_replace(' ', '+', $img); 
$data = base64_decode($img); 
$file = localhost/samp/sample2/uploads . uniqid() . '.png'; 
$success = file_put_contents($file, $data); 
print $success ? $file : 'Unable to save the file.'; 
?> 
+0

: daha iyi, sürekli mantıklı ad verin

$file = constant('localhost/samp/sample2/uploads') . uniqid() . '.png'; 

... ya: Bu sözdizimini kullanmak gerekir $ img = str_replace ('data: image/jpg; base64,', '', $ img); '$ img = str_replace olmalıdır ('data: image/png; base64,', '', $ img); –

+0

evet doğru !! Kodumun güncelleme sürümünü yazmayı unuttum: D ama benim sorunum hala var. – mkafiyan

+0

PHP bölümünü [PHP-FileUpload] (https://github.com/delight-im/PHP-FileUpload) ve ['DataUriUpload'] ile değiştirebilirsiniz (https://github.com/delight-im/ PHP-FileUpload/blob/d0065c47dcda18c4965ed900bb15190f7af30e79/src/DataUriUpload.php) bileşeni, [burada belgelendirilmiştir] (https://github.com/delight-im/PHP-FileUpload/tree/d0065c47dcda18c4965ed900bb15190f7af30e79#data-uri-uploads). Dosya boyutu sınırlamaları ve birden çok kabul edilen MIME türü gibi başka şeylerle de ilgilenir. – caw

cevap

1

PHP hata iletilerini görüntülemek için geliştirme kutunuzu yapılandırmamışsınızdan şüpheleniyorum. doğrudan kullanmak anlamına gelir Yani

define('localhost/samp/sample2/uploads', 'images/'); 

:

$file = localhost/samp/sample2/uploads . uniqid() . '.png'; 

... tetikleme edilmelidir:

Notice: Use of undefined constant localhost - assumed 'localhost' 
Notice: Use of undefined constant samp - assumed 'samp' 
Warning: Division by zero 
Notice: Use of undefined constant sample2 
Warning: Division by zero 
Notice: Use of undefined constant uploads - assumed 'uploads' 
Warning: Division by zero 

Geçerli bir tanımlayıcı olmayan bir sabit tanımlıyorsanız. .. ve file sadece temel dosya ismini içerecektir (örn. 53676a01cdb59.png), ancak yol bileşeni içermez. `Olarak bildiğim kadarıyla, toDataUrl png resim döndürür Varsayılan olarak

define('DIR_UPLOADS', 'images/'); 
0

Bu aynı sorunu başlamıştı - bu her zaman doğru gönderilen ediliyordu base64 verileri gibi görünüyordu ama görüntü sunucu tarafı oluşturulamadı . Bulduğum çözüm, 'FormData' nesnesini ve sunucuya göndermek için çok basit bir xhr isteğini kullanmaktı.

var url='/path/to/save.php'; 
var data=oCanvas.toDataURL('image/png').replace(/^data:image\/(png|jpg);base64,/, ''); 
var fd=new FormData(); 
fd.append('imgdata',data); 

var request = new XMLHttpRequest(); 
request.open('POST', url); 
request.send(fd); 

Sorunun yanlış Content-Type başlığı xhr isteği tarafından gönderilen neden oldu% 99 eminim. FormData ile birlikte bir temel xhr isteği kullanmak, doğru tanımlanmış içerik sınırları olan çok parçalı/formdata içerik türüyle gönderilecek xhr isteğini zorladı.