gpt4 book ai didi

javascript - 使用 php 从通过 ajax 发送的 dataURI 生成 png 文件

转载 作者:行者123 更新时间:2023-12-01 05:29:51 26 4
gpt4 key购买 nike

我有一个 svg 文件,它正在生成 dataURI-png 并且效果很好。我希望将该 dataURI 保存为图像,因此我尝试通过 ajax 将 dataURI 发送到另一个可以执行 PHP 的服务器。但我无法让它工作。

这是生成 dataURI 的代码(有效)

var mySVG    = document.querySelector('svg'),      // Inline SVG element
tgtImage = document.querySelector('.tgtImage'); // Where to draw the result
can = document.createElement('canvas'), // Not shown on page
ctx = can.getContext('2d'),
loader = new Image; // Not shown on page

console.log(mySVG);

loader.width = can.width = tgtImage.width;
loader.height = can.height = tgtImage.height;
loader.onload = function(){
ctx.drawImage( loader, 0, 0, loader.width, loader.height );
tgtImage.src = can.toDataURL("image/png");
};

这是将其发送到外部 php 服务器的 ajax 代码:

$.ajax({
type: "POST",
data: {id:'testID',datauri: can.toDataURL("image/png")},
crossDomain: true,
//dataType: "jsonp",
url: "https://urltoscript.php",
success: function (data) {
console.log(data);
},
error: function (data) {
console.log(data);
}
});

生成 png 的 PHP 代码

$dataUrl = $_REQUEST['datauri'];
$id = $_REQUEST['id'];

list($meta, $content) = explode(',', $dataUrl);
$content = base64_decode($content);
file_put_contents('./tmp-png/'.$id.'.png', $content);

手动插入 dataURI 时 PNG 生成工作。但它不能与上面的ajax功能一起使用。

谢谢!

最佳答案

您可以使用canvas.toBlob() ,将图像作为 Blob 发送到 php,使用 php://input要在 php 读取 Blob ,请参阅 Beyond $_POST, $_GET and $_FILE: Working with Blob in JavaScript and PHP

JavaScript

if (!HTMLCanvasElement.prototype.toBlob) {
Object.defineProperty(HTMLCanvasElement.prototype, "toBlob", {
value: function (callback, type, quality) {

var binStr = atob( this.toDataURL(type, quality).split(",")[1] ),
len = binStr.length,
arr = new Uint8Array(len);

for (var i=0; i<len; i++ ) {
arr[i] = binStr.charCodeAt(i);
}

callback( new Blob( [arr], {type: type || "image/png"} ) );
}
});
}

can.toBlob(function(blob) {
var request = new XMLHttpRequest();
// to receive `echo`ed file from `php` as `Blob`
// request.responseType = "blob";
request.open("POST", "readBlobInput.php", true);
request.setRequestHeader("x-file-name", "filename");
request.onload = function() {
// `this.response` : `Blob` `echo`ed from `php`
// console.log(this.response)
console.log(this.responseText);
}
request.send(blob)
});

readBlobInput.php

<?php
// the Blob will be in the input stream, so we use php://input
$input = file_get_contents("php://input");
// choose a filename, use request header
$tmpFilename = $_SERVER["HTTP_X_FILE_NAME"];
// http://stackoverflow.com/q/541430/
$folder = __DIR__ . "/tmp-png";
// http://stackoverflow.com/q/17213403/
is_dir($folder) || @mkdir($folder) || die("Can't Create folder");
// put contents of file in folder
file_put_contents($folder . "/" . $tmpFilename, $input);
// get MIME type of file
$mime = mime_content_type($folder . "/" . $tmpFilename);
$type = explode("/", $mime);
// set MIME type at file
$filename = $tmpFilename . "." . $type[1];
// rename file including MIME type
rename($folder . "/" . $tmpFilename, $folder . "/" . $filename);
// to echo file
// header("Content-Type: " . $type);
// echo file_get_contents($newName);
echo $filename . " created";
?>

关于javascript - 使用 php 从通过 ajax 发送的 dataURI 生成 png 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38236047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com