html2canvas截图上传至后端并下载文件

前言:

主要是来源于一个需求,我需要将页面生成pdf然后下载,鉴于此页面的特殊性,最后决定的方案是我对后端难以生成的部分进行html截图上传到后端,然后后端将图片以及一些其它的部分根据itext生成pdf,然后返回给我。页面的实现效果是我点击按钮,然后pdf被下载。

参考:

第一章 在前端截图下载

值得注意的是html2canvas要用document.querySelector()来获取元素,如果使用$("#xxx")或者document.getElementById()我这里会提示Element is not attached to a Document(后面再次测试时发现只是$("#xxx")不行,document.getElementById()又可以了)

function downloadStudentData(){
	console.log("下载学生数据")
	//打印雷达图
	html2canvas(document.querySelector("#screenDiv"),{
		width: 1000,
		height:1000,
	}).then(canvas => {
	    document.body.appendChild(canvas)
	    var dataUrl = canvas.toDataURL("image/png");
		console.log(dataUrl);
		let aLink = document.createElement('a');
        //取出图片中的base64数据
		var bstr = atob(dataUrl.split(',')[1])
		var n = bstr.length
		var u8arr = new Uint8Array(n) 
		while (n--) {
		 	u8arr[n] = bstr.charCodeAt(n) 
		}
		var blob = new Blob([u8arr])
		let evt = document.createEvent("HTMLEvents");
        evt.initEvent("click", true, true);//initEvent 不加后两个参数在FF下会报错  事件类型,是否冒泡,是否阻止浏览器的默认行为
        aLink.download = "test.png";
        aLink.href = URL.createObjectURL(blob);
        aLink.click()

	});
	
	
}

 

第二章 将截图传至后端并下载文件

当然图片前端下载就好,这里本人要上传到后端主要是想测试下图片在后端能不能用。

之前想的是用ajax上传并下载文件,但是试了一下发现ajax不能下载文件,从网上找了个不严谨的说法:浏览器中js不能操作磁盘,不然会引起安全问题,要想操作磁盘需要调用浏览器的一些其它的api。

这里采用的是模拟表单提交,值得注意的是,在后端转化图片时要把base64图片的图片头去掉即把data:image/png;base64,去掉,只保留base64图片的数据。

前端:

function downloadStudentData(){
	//打印雷达图
	html2canvas(document.querySelector("#screenDiv"),{
		width: 1000,
		height:1000,
	}).then(canvas => {
//      document.body.appendChild(canvas)
	    var dataUrl = canvas.toDataURL("image/png");
		var form = $("<form></form>").attr("action", url).attr("method", "post");
		form.append($("<input></input>").attr("type", "hidden").attr("name", "canvasPhotoBase64Data").attr("value", dataUrl));
		form.appendTo('body').submit().remove();
	});
}

 

后端:

@RequestMapping("/test")
@RestController
public class TestUpload {
    @RequestMapping("/testUploadPhoto")
    public void testUploadPhoto(String canvasPhotoBase64Data, HttpServletResponse response){
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
        System.out.println("begin");
        System.out.println(canvasPhotoBase64Data);
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            FileOutputStream write = new FileOutputStream(new File("testPhoto"));
            byte[] decoderBytes = decoder.decodeBuffer(canvasPhotoBase64Data.split(",")[1]);
            response.setHeader("content-disposition", "attachment;filename=" + "test.png");
            response.setContentType("multipart/form-data");
            response.getOutputStream().write((decoderBytes));
            response.getOutputStream().flush();
            response.getOutputStream().close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 Vue3 中,可以通过以下步骤生成 canvas 的绝对路径并发送给后端: 1. 在 Vue3 的组件中,定义一个 canvas 元素,并设置它的宽度和高度: ```html <template> <canvas ref="canvas" width="500" height="500"></canvas> </template> ``` 2. 在组件的 methods 中,定义一个函数来绘制 canvas: ```js methods: { drawCanvas() { const canvas = this.$refs.canvas const ctx = canvas.getContext('2d') // 在 canvas 上绘制图形 ctx.fillStyle = 'red' ctx.fillRect(0, 0, 100, 100) } } ``` 3. 在组件的 mounted 钩子中,调用 drawCanvas 函数来绘制 canvas: ```js mounted() { this.drawCanvas() } ``` 4. 定义一个函数来将 canvas 转换为图片Base64 编码: ```js toDataURL(canvas) { const dataURL = canvas.toDataURL('image/png') return dataURL.replace(/^data:image\/(png|jpg);base64,/, '') } ``` 5. 在组件中,可以调用 toDataURL 函数将 canvas 转换为 Base64 编码图片,并将其发送给后端: ```js sendImage() { const canvas = this.$refs.canvas const dataURL = this.toDataURL(canvas) // 发送数据到后端 axios.post('/api/upload-image', { image: dataURL }) .then(response => { console.log(response) }) .catch(error => { console.error(error) }) } ``` 这样就可以在 Vue3 中生成 canvas 的绝对路径并发送给后端了。注意,这里发送的是图片Base64 编码,而不是图片的绝对路径。如果需要发送图片的绝对路径,可以将 Base64 编码保存为文件,然后将文件上传到服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值