我正在努力使用JavaScript和PHP将我的画布图像保存到服务器。我已经尝试了JS和PHP的多个例子,但总是失败。关于如何将图像数据发送到PHP脚本(bas64、blob、FormData),有相互矛盾的建议,我不确定如何最好地与JS通信。目前,零字节的PNG文件被保存到服务器,我不知道为什么。我想在服务器上将生成的画布保存为PNG,并在成功时在JS中执行命令。如何最好地处理它?
JS:
var off_canvas = document.createElement('canvas');
off_canvas.width = 1080;
off_canvas.height= 1080;
var ctx = off_canvas.getContext("2d");
var brick = new Image();
brick.src = '../img/brick-white.jpg';
brick.onload = function(){
var pattern = ctx.createPattern(this, "repeat");
ctx.fillStyle = pattern;
ctx.fill();
};
var base64img = off_canvas.toDataURL("image/jpeg");
fetch("../php/save_image.php", {
method: "POST",
image: base64img
}) .then(response => response.text())
.then(success => console.log(success)) //execute command
.catch(error => console.log(error));
PHP:
<?php
$img = $_POST['image'];
$img = str_replace('data:image/png;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$data = base64_decode($img);
if (!file_exists($_SERVER['DOCUMENT_ROOT'] . "/img")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/img", 0777, true);
}
$file = $_SERVER['DOCUMENT_ROOT'] . "/img/".time().'.png';
$success = file_put_contents($file, $data);
print $success ? $file.' saved.' : 'Unable to save the file.';
?>
在对JS和PHP上的多个选项进行了一些修改后,这是最终奏效的:
JS
var off_canvas = document.createElement('canvas');
off_canvas.width = 1080;
off_canvas.height = 1080;
var off_ctx = off_canvas.getContext("2d");
off_ctx.beginPath();
off_ctx.rect(20, 20, 150, 800);
off_ctx.fillStyle = "red";
off_ctx.fill();
var brick = new Image();
brick.src = "img/brick-white.jpg";
brick.onload = function(){
var pattern = off_ctx.createPattern(brick, "repeat");
off_ctx.fillStyle = pattern;
off_ctx.fillRect(500, 0, 1000, 1000);
// needs delay to fully render to canvas
var timer = window.setTimeout(save_canvas(off_canvas), 500);
};
function save_canvas(c) {
var b64Image = c.toDataURL("image/png");
fetch("../php/save_image_b64.php", {
method: "POST",
mode: "no-cors",
headers: {"Content-Type": "application/x-www-form-urlencoded"},
body: b64Image
}) .then(response => response.text())
.then(success => console.log(success))
.catch(error => console.log(error));
}
PHP
<?php
$img = file_get_contents("php://input"); // $_POST didn't work
$img = str_replace('data:image/png;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$data = base64_decode($img);
if (!file_exists($_SERVER['DOCUMENT_ROOT'] . "/img")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/img", 0777, true);
}
$file = $_SERVER['DOCUMENT_ROOT'] . "/img/".time().'.png';
$success = file_put_contents($file, $data);
print $success ? $file.' saved.' : 'Unable to save the file.';
?>
在js页面中添加控制台。日志(base64img)
在浏览器控制台中,复制对象。我使用firefox,如果你使用其他东西,然后从那里复制控制台消息。
消息将是
data: Image/jpeg; bas64,/9j/4AAQSk......
。
在php页面中;
$img = "data:image/jpeg;base64,/9j/4AAQSk.....";
echo "<img src='$data' />"; exit;
现在你就知道图像是否会出现。
如果图像没有显示,您没有正确实现
提取
方法
如果图像显示,看看你是否能够创建dir/file.也就是说,apache有权限创建dir/file.如果你能够
我正在进行一个生成艺术项目,我希望允许用户保存从一个算法得到的图像。大意是: 使用生成算法在HTML5画布上创建图像 完成映像后,允许用户将画布作为映像文件保存到服务器 允许用户下载图像或将其添加到使用该算法生成的图像库中。 然而,我却被卡在了第二步上。经过谷歌的一番帮助,我找到了这篇博文,似乎正是我想要的: 这导致了JavaScript代码: 和相应的PHP(testsave.PHP): 但这似
我有一个画布元素,其中有一个绘图,我想创建一个按钮,当点击它时,它将把图像保存为一个png文件。因此它应该打开“保存、打开、关闭”对话框... 我使用这个代码 但当我在IE9中测试它时,一个新窗口打开了,上面写着“网页无法显示”,其url是: 有人知道怎么解决这个吗?
问题内容: 我正在从事一个生成艺术项目,我希望允许用户从算法中保存生成的图像。总体思路是: 使用生成算法在HTML5 Canvas上创建图像 图像完成后,允许用户将画布作为图像文件保存到服务器 允许用户下载图像或将其添加到使用该算法制作的作品库中。 但是,我坚持第二步。在Google的帮助下,我找到了这篇博客文章,这似乎正是我想要的: 导致了JavaScript代码: 和相应的PHP(testSa
问题内容: 我需要即时将画布图像数据上传到服务器(数据库),即,我需要创建一个带有input=file的表单,并在没有任何用户交互的情况下发布图像数据。 问题答案: 您不需要文件输入,只需使用Ajax 获取数据并将其发布到服务器即可。 请参阅MDN文档。 但是即使使用,您也无法在IE中获取图像数据。
问题内容: 我有这样的JavaScript代码 我的PHP代码是这样的 执行此代码时,我得到了一个零尺寸的png文件图像?我的代码有什么问题? 问题答案: 我最近不得不自己做。 首先,我将canvasData放入一个隐藏字段中,并将其发布到我的PHP页面中。 它以以下格式返回: 您需要首先拆分数据,因为这是标题信息。其余的是编码数据。 然后,在服务器上创建映像: 然后阅读以完成我想做的事情。 我非
我有一个带有背景图像的HTML5画布元素。用户被允许在图像上绘制,然后需要保存完整的画布元素与背景。我使用下面的代码保存部分,但它只得到画布绘图,而不是背景图像。我还可以做什么来获得背景图像? 更新: 我的HTML 我有上面的div在我的HTML页面。然后我动态地创建画布并在其上绘制。这是一个有点长的代码。