2011-09-03 36 views
5

Tôi gặp khó khăn khi sử dụng dữ liệu được tạo bằng phương thức todataurl() của canvas. Hiện tại mã của tôi gửi dữ liệu kết quả đến máy chủ php của tôi sử dụng phương thức file_put_contents() để tạo một tệp để lưu trữ dữ liệu đó. Bây giờ nếu tôi cắt và dán kết quả sai ngữ pháp từ tập tin vào một thẻ hình ảnh src nó hoạt động tốt và hiển thị đúng cách vì vậy tôi giả định cho đến nay tất cả mọi thứ là đào.Giải mã canvas todataURL

Nhưng tôi tiếp tục gặp sự cố khi cố gắng sử dụng mã trong JS. Tôi đã thử phương pháp base64_decode của php nhưng vẫn nhận được các tập tin currupt. Tôi đã tìm thấy mã này:

<?php 
    $encodedData = str_replace(' ','+',$encodedData); 
    $decocedData = base64_decode($encodedData); 

và vẫn nhận các tệp bị gián đoạn. Lý tưởng nhất là tôi muốn tạo một tệp .png với nó nhưng tôi sẽ giải quyết để xử lý lại tệp dữ liệu trong JS. Bất kỳ trợ giúp đánh giá rất nhiều.

+0

Bạn chỉ cần phải đọc kiểu MIME (có thể là cố định/biết) và mã hóa (có thể là không có) để giải thích các dữ liệu, đó là tiêu chuẩn Base64. Sẽ không có bất kỳ khoảng trống nào để thay thế nếu bạn đã mã hóa URL dữ liệu nhập trước đó. [PHP-FileUpload] (https://github.com/delight-im/PHP-FileUpload) có ['DataUriUpload'] (https://github.com/delight-im/PHP-FileUpload/blob/023f812226673ac9e0696d8a3579bb7380606dda/ src/DataUriUpload.php) thành phần thực hiện tất cả điều này một cách tự động. Tài liệu được mô tả [tại đây] (https://github.com/delight-im/PHP-FileUpload/tree/023f812226673ac9e0696d8a3579bb7380606dda#data-uri-uploads). – caw

Trả lời

12

Dường như bạn phải loại bỏ tiêu đề được thêm vào dữ liệu hình ảnh theo hàm toDataURL(). Về phía khách hàng, bạn có thể lột tiêu đề như thế này:

.. 
var data=canvas.toDataURL(); 
var output=data.replace(/^data:image\/(png|jpg);base64,/, ""); 
// now send "output" to the server 
.. 

Về việc sử dụng máy chủ bên này:

<?php 
    $decocedData = base64_decode($encodedData); 
?> 
+3

Đó là hữu ích, đây là những gì tôi đã kết thúc làm nếu có ai cần làm tương tự trong tương lai: \t $ backGround = substr ($ backGround, 22); \t $ backGround = str_replace ('', '+', $ backGround); \t $ backGround = base64_decode ($ backGround); \t file_put_contents ("currentBG1.png ", $ backGround); – joel

+0

cũng cần thêm jpeg vào biểu thức chính quy: var output = data.replace (/^data: image \/(png | jpg | jpeg); base64, /," "); – dickyj

3

Trong kịch bản java gửi kết quả từ canvas.toDataURL() trên những trình duyệt hơn hỗ trợ phương thức này với loại "image/png" mặc định.

var imageInfo = canvas.toDataURL(); 
// now send "imageInfo" to the server 

cách trực tiếp để tạo ra các tập tin png:

<?php 
$imageInfo = imageInfoFromBrowser(); // Your method to get the data 
$image = fopen($imageInfo, 'r'); 
file_put_contents("fileName.png", $image); 
fclose($image); 
?> 

tôi đã làm việc này trong PHP 5.3/Windows, cho phiên bản khác, vui lòng kiểm tra.

Mẫu dữ liệu hình ảnh để thử nghiệm trên PHP.

$imageInfo = "data:image/png;base64,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" 
+0

Nếu điều này không thành công cho bạn, vui lòng đăng môi trường PHP của bạn.Thêm –

+0

canvas.toDataUrl() ... đây là gì? – realtebo

+1

'canvas.toDataUrl()' được sử dụng ví dụ trên [fabric.js] (http: // Bạn có thể lấy canvas của mình thông qua JavaScript 'var imageInfo = document.getElementById (" yourid "). toDataURL();' hoặc thông qua JQuery 'var imageInfo = $ (" # yourid "). toDataURL() ; ' Giải pháp này được đăng bởi @ DanielDeLeón hoạt động như một sự quyến rũ. Cảm ơn bạn, – ptCoder

2

Lưu ý quan trọng khác là bạn phải chuyển đổi khoảng trống thành ô tô. Nếu bạn không làm điều đó, các dữ liệu được giải mã là hỏng:

$encodedData = str_replace(' ','+',$encodedData); 
$decocedData = base64_decode($encodedData); 

Bạn có thể đọc thêm tại http://www.php.net/manual/en/function.base64-decode.php

0

giải pháp khác không làm việc cho tôi.

này hoạt động:

//image sample 
$baseFromJavascript = "data:image/png;base64,BBBFBfj42Pj4"; 

// remove the part that we don't need from the provided image and decode it 
$data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $baseFromJavascript));