2011-07-18 32 views
45

Tôi có một URI dữ liệu tôi nhận được từ javascript và cố gắng lưu qua php. Tôi sử dụng đoạn mã sau cung cấp tệp hình ảnh bị hỏng:Dữ liệu PHP-URI để nộp

$data = $_POST['logoImage']; 

    $uri = substr($data,strpos($data,",")+1); 

    file_put_contents($_POST['logoFilename'], base64_decode($uri)); 



data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs 9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAxklEQVQYlYWQMW7CUBBE33yITYUUmwbOkBtEcgUlTa7COXIVV5RUkXKC5AxU EdyZVD4kyKxkwIrr9vd0c7Oih aopinLNsF6Qkg2XW4XJ7LGFsAAcTV6lF5/jLdbALA9XDAXYfthFQVx OrmqKYK88/7rbbMFksALieTnzu9wDYTj6f70PKsp2kwAiSvjXNcvkWpAfNZkzWa/5a9yT7fdoX7rrB7hYh2fXo9HdjPYQZu3MIU8bYIlW20y0RUlXG2Kpv/vfwLxhTaSQwWqwhAAAAAElFTkSuQmCC 

Dưới mã là hình ảnh thực tế làm URI dữ liệu. 'logoImage' là chuỗi ở trên và $ uri là chuỗi trừ 'image/jpeg; base64'.

+0

Tôi xin lỗi đã làm cho tôi một lỗi đánh máy ở đâu đó? – GAgnew

+0

URI dữ liệu bạn có trong ví dụ của mình không phải là hình ảnh PNG hợp lệ. Điều này sẽ không bao giờ làm việc và không liên quan đến mã, nó liên quan đến dữ liệu. – hakre

+0

Bạn có thể muốn giữ nó như một hình ảnh base64. Tôi đoán, bởi vì tôi không phải là một chuyên gia nhị phân, rằng tất cả các ví dụ được đưa ra ở đây mang lại một kết quả 32 bit. Kể từ PHP 5.2, các url dữ liệu sẽ hoạt động, vì vậy giải pháp có thể thực sự đơn giản như: 'file_put_contents ('logo.png', preg_replace (/ \ s + /, '+', $ _POST ['logoImage']))' nếu bạn đang sử dụng API FileReader JavaScript cùng với AJAX. – PHPglue

Trả lời

61

Một cái nhìn nhanh chóng at the PHP manual mang lại như sau:

Nếu bạn muốn lưu dữ liệu mà có nguồn gốc từ một hàm Javascript canvas.toDataURL(), bạn phải chuyển đổi chỗ trống vào plusses. Nếu bạn không làm điều đó, các dữ liệu được giải mã là hỏng:

<?php 
    $encodedData = str_replace(' ','+',$encodedData); 
    $decodedData = base64_decode($encodedData); 
?> 
+0

Điều này đã hiệu quả. Wow, tôi không thể tin rằng tôi không thể tìm thấy điều này sớm hơn! Tôi sẽ chấp nhận điều này ngay khi có thể, nhờ @Graydot – GAgnew

40

URI dữ liệu bạn có trong ví dụ của mình không phải là hình ảnh PNG hợp lệ. Điều này sẽ không bao giờ làm việc và không liên quan đến mã, nó liên quan đến dữ liệu.


Không áp dụng nhưng có thể quan tâm:

file_put_contents($_POST['logoFilename'], file_get_contents($data)); 

Ý tưởng đằng sau: PHP tự nó có thể đọc nội dung của data URIs (data://) do đó bạn không cần phải giải mã nó trên của riêng bạn.

Lưu ý rằng lược đồ URI dữ liệu chính thức (ref: The "data" URL scheme RFC 2397) không bao gồm dấu gạch chéo kép ("//") sau dấu hai chấm (":"). PHP hỗ trợ có hoặc không có hai dấu gạch chéo.

# RFC 2397 conform 
$binary = file_get_contents($uri); 

# with two slashes 
$uriPhp = 'data://' . substr($uri, 5); 
$binary = file_get_contents($uriPhp); 
+2

Và cuối cùng: 'file_put_contents ($ _ POST ['logoFilename'], $ nhị phân); ' – andreszs

+0

Chúng tôi đang ở trên 5,5,25 PHP, và có vẻ như không cần phải thêm dấu gạch chéo kép. – Andz

+1

@Andz: Có vẻ như với PHP 5.2+ này luôn hoạt động: http://3v4l.org/Fk4RY - nhận xét rất hay về PHP.net cũng đã cũ rồi. Đừng tin tưởng vào bản đồ, tin tưởng địa hình, cảm ơn một lần nữa vì gợi ý. Đã sửa câu trả lời. – hakre

19

Các tất cả các mã mà làm việc:

$imgData = str_replace(' ','+',$_POST['image']); 
$imgData = substr($imgData,strpos($imgData,",")+1); 
$imgData = base64_decode($imgData); 
// Path where the image is going to be saved 
$filePath = $_SERVER['DOCUMENT_ROOT']. '/ima/temp2.png'; 
// Write $imgData into the image file 
$file = fopen($filePath, 'w'); 
fwrite($file, $imgData); 
fclose($file); 
+0

!!Tôi đã thử một TON câu trả lời trên SO và ở nơi khác, và đây là điều duy nhất đã làm việc! Nó đã làm việc! Cảm ơn. – Jake

Các vấn đề liên quan