引自免费微信小程序:皆我百晓生
当然,我会尽力帮助您解决这两个问题。
问题1:图片下载兼容性问题
在不同的浏览器中实现 base64 图片的下载可能会存在兼容性差异。针对手机QQ等浏览器无法下载的问题,您可以尝试使用 Blob
对象和 URL.createObjectURL() 方法来创建一个临时的指向文件对象的 URL,这样可以提高兼容性:
function onLog() {
const base64 = autograph.getBase64();
if (!base64) return alert("当前签名为空,不可下载!");
// 将base64转换为Blob对象
const byteString = atob(base64.split(',')[1]);
const mimeString = 'image/png'; // 根据实际情况调整图片类型
const ab = new ArrayBuffer(byteString.length);
const ia = new Uint8Array(ab);
for (let i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
const blob = new Blob([ab], { type: mimeString });
// 创建下载链接
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = "q-ming.png"; // 设置下载的文件名
document.body.appendChild(link); // 需要将链接添加到DOM中才能触发点击事件
link.click();
setTimeout(() => {
URL.revokeObjectURL(link.href); // 释放内存
document.body.removeChild(link);
}, 0);
}
问题2:将图片上传至服务器或数据库
首先,你需要通过Ajax或者Fetch API将图片(Blob或Base64格式)发送到服务器端。以下是一个使用Fetch API的例子,假设服务器有一个接收POST请求并保存文件的API接口 /api/save_signature
:
async function xupLog() {
const base64 = autograph.getBase64();
if (!base64) return alert("当前签名为空,不可上传!");
// 将base64转为Blob对象(与问题1中的转换相同)
const byteString = atob(base64.split(',')[1]);
const mimeString = 'image/png';
const ab = new ArrayBuffer(byteString.length);
const ia = new Uint8Array(ab);
for (let i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
const blob = new Blob([ab], { type: mimeString });
try {
// 发送POST请求到服务器,包含FormData对象
const formData = new FormData();
formData.append('signature', blob, 'qming.png'); // 文件字段名及上传时的文件名
// 发送请求,这里假设服务器返回JSON数据
const response = await fetch('/api/save_signature', {
method: 'POST',
body: formData,
});
// 检查响应状态
if (response.ok) {
console.log('签名已成功上传到服务器');
// 这里可以根据服务器返回的数据更新数据库表fil_from中的fData2字段
// 假设你已经有了一个更新数据库的方法updateDatabase()
// updateDatabase(response.data);
} else {
throw new Error(`上传失败,HTTP状态码:${response.status}`);
}
} catch (error) {
console.error('上传签名时发生错误:', error);
alert('签名上传失败,请稍后重试');
}
}
请注意,上述代码仅展示了如何将图片以二进制形式发送到服务器,并假定服务器端已经做好了接收和处理此请求的逻辑,例如保存文件到指定路径(如 "..ypic/"),或将其内容存入数据库(如 "edu_sup.mdb" 的 "fil_from" 表的 "fData2" 字段)。具体的服务器端处理方式取决于您所使用的后端语言和技术栈。