来自 Post 的 PNG 请求加载到 Canvas
PNG from Post Request loading into Canvas
这是一个非常具体的问题,我还没有找到其他人问过它。
基本上我有一个接受一些参数和 returns PNG 图像的 servlet。我知道 servlet 可以工作,因为如果我用给定的参数打开页面本身,文件就会成功创建和下载。我需要一些方法来获取生成的 PNG 并将其加载到 HTML5 Canvas 中。
我无权更改 servlet,它必须是 POST 请求,因为它不是我设计的。此时我的代码本质上只是一个 jQuery post 请求,但这里是:
$.post("../dgexport?format=png",
{
data: localStorage.getItem("dg::export"),
responseType: "blob",
},
function(res){
loadCanvas(res);
});
function loadCanvas(image) {
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
// load image
context.drawImage(image, 0, 0);
}
当我打开控制台并查看 POST 请求的数据响应时,它在控制台中看起来像:
�PNG↵↵IHDR��lD�V pHYs�� IDATx��~---���088'���� IDAT��?��q%�
(这不是全部,但我希望它足以给任何愿意提供帮助的人一个提示)
如有任何帮助,我们将不胜感激!我尝试了很多不同的方法,但我真的对这个感到难过。
看起来传递给您的成功函数的 res
没有像预期的那样返回 Blob,这意味着您可能需要将其转换为一个
function (res) {
if (res instanceof Blob) // function invoked as expected
return loadCanvas(res);
if (typeof res === 'string') // function invoked with String
return loadCanvas(new Blob([res], {type: 'image/png'});
console.warn('Unexpected Response:', res); // anything else
}
您不能使用 jQuery ajax 进行输入请求,请参阅 here
此外,您必须将图像元素传递给 context.drawImage
而不是 blob 或字符串。
发出 post 获取图像的请求似乎是糟糕的设计,但可以使用原始 XMLHttpRequest 完成。
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if (this.readyState == 4 && this.status == 200){
var img = document.getElementById('img');
var url = window.URL || window.webkitURL;
img.onload = function(){
loadCanvas(this);
}
img.src = url.createObjectURL(this.response);
}
}
xhr.open('POST', "../dgexport?format=png");
xhr.responseType = 'blob';
xhr.send($.param({data: localStorage.getItem("dg::export")}));
这是一个非常具体的问题,我还没有找到其他人问过它。
基本上我有一个接受一些参数和 returns PNG 图像的 servlet。我知道 servlet 可以工作,因为如果我用给定的参数打开页面本身,文件就会成功创建和下载。我需要一些方法来获取生成的 PNG 并将其加载到 HTML5 Canvas 中。
我无权更改 servlet,它必须是 POST 请求,因为它不是我设计的。此时我的代码本质上只是一个 jQuery post 请求,但这里是:
$.post("../dgexport?format=png",
{
data: localStorage.getItem("dg::export"),
responseType: "blob",
},
function(res){
loadCanvas(res);
});
function loadCanvas(image) {
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
// load image
context.drawImage(image, 0, 0);
}
当我打开控制台并查看 POST 请求的数据响应时,它在控制台中看起来像:
�PNG↵↵IHDR��lD�V pHYs�� IDATx��~---���088'���� IDAT��?��q%�
(这不是全部,但我希望它足以给任何愿意提供帮助的人一个提示)
如有任何帮助,我们将不胜感激!我尝试了很多不同的方法,但我真的对这个感到难过。
看起来传递给您的成功函数的 res
没有像预期的那样返回 Blob,这意味着您可能需要将其转换为一个
function (res) {
if (res instanceof Blob) // function invoked as expected
return loadCanvas(res);
if (typeof res === 'string') // function invoked with String
return loadCanvas(new Blob([res], {type: 'image/png'});
console.warn('Unexpected Response:', res); // anything else
}
您不能使用 jQuery ajax 进行输入请求,请参阅 here
此外,您必须将图像元素传递给 context.drawImage
而不是 blob 或字符串。
发出 post 获取图像的请求似乎是糟糕的设计,但可以使用原始 XMLHttpRequest 完成。
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if (this.readyState == 4 && this.status == 200){
var img = document.getElementById('img');
var url = window.URL || window.webkitURL;
img.onload = function(){
loadCanvas(this);
}
img.src = url.createObjectURL(this.response);
}
}
xhr.open('POST', "../dgexport?format=png");
xhr.responseType = 'blob';
xhr.send($.param({data: localStorage.getItem("dg::export")}));