Tôi đang làm việc trong một dự án nghệ thuật tổng quát nơi tôi muốn cho phép người dùng lưu hình ảnh thu được từ một thuật toán. Ý tưởng chung là:
- Tạo hình ảnh trên Canvas HTML5 bằng thuật toán tổng quát
- Khi hình ảnh hoàn thành, cho phép người dùng lưu canvas dưới dạng tệp hình ảnh vào máy chủ
- Cho phép người dùng tải xuống hình ảnh hoặc thêm nó vào một bộ sưu tập các mảnh được sản xuất bằng thuật toán.
Tuy nhiên, tôi bị kẹt ở bước thứ hai. Sau một số trợ giúp từ Google, tôi tìm thấy bài đăng trên blog này , dường như chính xác những gì tôi muốn:
Điều này dẫn đến mã JavaScript:
function saveImage() {
var canvasData = canvas.toDataURL("image/png");
var ajax = new XMLHttpRequest();
ajax.open("POST", "testSave.php", false);
ajax.onreadystatechange = function() {
console.log(ajax.responseText);
}
ajax.setRequestHeader("Content-Type", "application/upload");
ajax.send("imgData=" + canvasData);
}
và PHP tương ứng (testSave.php):
<?php
if (isset($GLOBALS["HTTP_RAW_POST_DATA"])) {
$imageData = $GLOBALS['HTTP_RAW_POST_DATA'];
$filteredData = substr($imageData, strpos($imageData, ",") + 1);
$unencodedData = base64_decode($filteredData);
$fp = fopen('/path/to/file.png', 'wb');
fwrite($fp, $unencodedData);
fclose($fp);
}
?>
Nhưng điều này dường như không làm gì cả.
Nhiều Googling bật lên bài đăng blog này dựa trên hướng dẫn trước. Không khác lắm, nhưng có lẽ đáng để thử:
$data = $_POST['imgData'];
$file = "/path/to/file.png";
$uri = substr($data,strpos($data, ",") + 1);
file_put_contents($file, base64_decode($uri));
echo $file;
Cái này tạo ra một tập tin (yay) nhưng nó bị hỏng và dường như không chứa bất cứ thứ gì. Nó cũng có vẻ trống rỗng (kích thước tệp bằng 0).
Có điều gì thực sự rõ ràng rằng tôi đang làm sai? Đường dẫn nơi tôi lưu trữ tệp của mình có thể ghi được, vì vậy đó không phải là vấn đề, nhưng dường như không có gì xảy ra và tôi không thực sự chắc chắn làm thế nào để gỡ lỗi này.
Biên tập
Theo liên kết của Salvidor Dali, tôi đã thay đổi yêu cầu AJAX thành:
function saveImage() {
var canvasData = canvas.toDataURL("image/png");
var xmlHttpReq = false;
if (window.XMLHttpRequest) {
ajax = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
ajax = new ActiveXObject("Microsoft.XMLHTTP");
}
ajax.open("POST", "testSave.php", false);
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajax.onreadystatechange = function() {
console.log(ajax.responseText);
}
ajax.send("imgData=" + canvasData);
}
Và bây giờ tệp hình ảnh được tạo và không trống! Có vẻ như loại nội dung quan trọng và việc thay đổi nó để x-www-form-urlencoded
cho phép dữ liệu hình ảnh được gửi.
Bảng điều khiển trả về chuỗi (khá lớn) của mã base64 và tệp dữ liệu là ~ 140 kB. Tuy nhiên, tôi vẫn không thể mở nó và dường như nó không được định dạng như một hình ảnh.
$data
trong mã php thứ hai), tất cả những gì tôi nhận được là một dòng trống. Tại sao lại như vậy? Có vẻ như có lẽ dữ liệu được gửi không chính xác, nhưng có vẻ như tôi đang gửi nó giống như các ví dụ hiển thị ...
DataUriUpload
thành phần của nó thay thế. Nó được ghi lại ở đây và đi kèm với một số phương tiện xác nhận bổ sung và thực thi bảo mật.
ajax.send(canvasData );
bạn trong khi bạn sử dụng nó như thế nàoajax.send("imgData="+canvasData);
. Do đó$GLOBALS["HTTP_RAW_POST_DATA"]
sẽ không phải là những gì bạn mong đợi, có lẽ bạn nên sử dụng$_POST['imgData']
.