我正在用 html、php 和一些 javascript 开发应用程序,肯定有人已经在这里阅读了我的疑问。我有一个画布,我在其中为用户签名,并且在我的表单中有一个按钮,我可以在其中将画布转换为 png 图像,并且 Windows 框会自动出现以选择要下载的文件夹,但我不想要那。我希望签名自动下载到文件夹中。附上 html 代码和 JavaScript
画布定义:
<canvas id="canvas">
Su navegador no soporta canvas
</canvas>
这是转换按钮的代码片段:
<script type="text/javascript">
function guardar() {
var link = document.createElement('a')
link.download = "firma";
link.href = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream");
link.click();
}
</script>
画布事件:
<script type="text/javascript">
var limpiar = document.getElementById("limpiar");
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var cw = canvas.width = 150, cx = cw / 2;
var ch = canvas.height = 150, cy = ch / 2;
var dibujar = false;
var factorDeAlisamiento = 5;
var trazados = [];
var puntos = [];
ctx.lineJoin = "round";
limpiar.addEventListener('click', function(evt){
dibujar = false;
ctx.clearRect(0, 0, cw, ch);
trazados.length = 0;
puntos.length = 0;
}, false);
canvas.addEventListener('mousedown', function(evt) {
dibujar = true;
//ctx.clearRect(0, 0, cw, ch);
ctx.beginPath();
}, false);
canvas.addEventListener('mouseup', function(evt) {
dibujar = false;
}, false);
canvas.addEventListener("mouseout", function(evt) {
dibujar = false;
}, false);
canvas.addEventListener("mousemove", function(evt) {
if (dibujar) {
var m = oMousePos(canvas, evt);
puntos.push(m);
ctx.lineTo(m.x, m.y);
ctx.stroke();
}
}, false);
function reducirArray(n,elArray) {
var nuevoArray = [];
nuevoArray[0] = elArray[0];
for (var i = 0; i < elArray.length; i++) {
if (i % n == 0) {
nuevoArray[nuevoArray.length] = elArray[i];
}
}
nuevoArray[nuevoArray.length - 1] = elArray[elArray.length - 1];
Trazados.push(nuevoArray);
}
function calcularPuntoDeControl(ry, a, b) {
var pc = {}
pc.x = (ry[a].x + ry[b].x) / 2;
pc.y = (ry[a].y + ry[b].y) / 2;
return pc;
}
function alisarTrazado(ry) {
if (ry.length > 1) {
var ultimoPunto = ry.length - 1;
ctx.beginPath();
ctx.moveTo(ry[0].x, ry[0].y);
for (i = 1; i < ry.length - 2; i++) {
var pc = calcularPuntoDeControl(ry, i, i + 1);
ctx.quadraticCurveTo(ry[i].x, ry[i].y, pc.x, pc.y);
}
ctx.quadraticCurveTo(ry[ultimoPunto - 1].x, ry[ultimoPunto - 1].y, ry[ultimoPunto].x, ry[ultimoPunto].y);
ctx.stroke();
}
}
function redibujarTrazados(){
dibujar = false;
ctx.clearRect(0, 0, cw, ch);
reducirArray(factorDeAlisamiento,puntos);
for(var i = 0; i < Trazados.length; i++){
alisarTrazado(Trazados[i]);
}
}
function oMousePos(canvas, evt){
var ClientRect = canvas.getBoundingClientRect();
return { //objeto
x: Math.round(evt.clientX - ClientRect.left),
y: Math.round(evt.clientY - ClientRect.top)
}
}
</script>
我会丢失代码或部分代码,以了解如何将图像保存在特定路径、特定文件夹中。
提前致以问候和感谢。
简短的回答是,不可能强制这样做。
原因很简单,是浏览器(或用户)决定是否显示“另存为”窗口,从 Javascript 你无法控制它,因为这是用户的偏好,浏览器不提供 API 来改变该设置,某些浏览器默认启用此选项,而其他浏览器则没有。
在 Chrome 中,您可以在 chrome://settings/ >> 高级 >> 下载 >> “下载前询问每个文件的保存位置”中看到它
要将图像发送到服务器,您需要准备一个表单,将其作为“文件”字段包含并发送,但是将其放在画布上会更容易,因为您可以通过 json 将图像作为点的集合发送到 php ,然后您可以将其保存在数据库字段中,并在最适合您时使用 sigToSvg 类(https://github.com/kaltura/agent-contrib/blob/master/sigToSvg.php)转换为图像,如果相反你喜欢在 png 或 jpeg 中的 svg 你使用 Imagick 或 gd 类,从 php 它看起来像这样:
如果您仍想将图像作为图像发送:
然后你发送正常的形式或通过 ajax 通常:
通过阿贾克斯:
希望这可以帮到你