vue中canvas生成图片并上传服务器

本文详细介绍了如何将canvas内容转换为图片并上传到服务器的两种策略:一是直接将canvas转为base64字符串上传,二是先转为base64再转化为file类型上传。提供了一套完整的代码实现,包括canvas转base64、base64转file以及使用formData进行上传的Vue示例。

将canvas转化为图片并上传服务器,有两种思路
思路1  直接将canvas转化为base64编码,将base64编码的字符串上传服务器,让后端转化为图片;
思路2  需要将canvas的内容先转化为base64编码的字符串,再将字符串转化为file上传; 

1 将canvas转化为file


canvas转化为64
canvasToBase64: function(canvas){
    // 'image/png'可以换成'image/jpeg'
    return canvas.toDataURL('image/png');
}

 

canvas转化为图片
canvasToImg: function(canvas){
    let image = new Image();
    image.src = canvas.toDataURL('image/png')
    return image;
}


base64转化为file
base64ToFile: function(urlData, fileName){
    let arr = urlData.split(',');
    let mime = arr[0].match(/:(.*?);/)[1];
    let bytes = atob(arr[1]);
    let n = bytes.length
    let ia = new Uint8Array(n);
    while (n--) {
        ia[n] = bytes.charCodeAt(n);
    }
    return new File([ia], fileName, { type: mime });
}

 

2 vue上传canvas


使用formData上传canvas
submitImg: function(canvas){
    let param= new FormData();
    param.append("file", this.base64ToFile(canvas.toDataURL('image/png'));
    param.append("user_name", 'mason');
    
    // 注意添加headers
    axios.post('/que/admin/final/report/chess/image/add/', param, {headers:{'Content-Type': 'multipart/form-data'}}).then(res=>{
        console.log(res.data);
    });
}

Vue中,将一个`div`生成图片保存上传服务器可以通过以下步骤实现: 1. **使用html2canvas库**:这是一个可以将HTML元素转换为Canvas的库。 2. **将Canvas转换为图片**:使用Canvas的API将Canvas转换为图片数据。 3. **上传图片服务器**:使用`axios`或其他HTTP库将图片数据上传服务器。 以下是一个详细的实现步骤: ### 1. 安装html2canvas 首先,需要安装`html2canvas`库: ```bash npm install html2canvas --save ``` ### 2. 创建Vue组件 创建一个Vue组件,在其中使用`html2canvas`将`div`转换为图片上传。 ```vue <template> <div> <div ref="capture" style="padding: 10px; background: #f5da55"> <h4 style="color: #000">Hello, this is a div!</h4> </div> <button @click="captureDiv">生成图片上传</button> </div> </template> <script> import html2canvas from 'html2canvas'; import axios from 'axios'; export default { methods: { async captureDiv() { const el = this.$refs.capture; try { const canvas = await html2canvas(el); const dataURL = canvas.toDataURL('image/png'); this.uploadImage(dataURL); } catch (error) { console.error('Error capturing div:', error); } }, uploadImage(dataURL) { const blob = this.dataURItoBlob(dataURL); const formData = new FormData(); formData.append('image', blob, 'div-image.png'); axios.post('https://your-server-endpoint.com/upload', formData) .then(response => { console.log('Image uploaded successfully:', response.data); }) .catch(error => { console.error('Error uploading image:', error); }); }, dataURItoBlob(dataURI) { const byteString = atob(dataURI.split(',')[1]); const mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; const ab = new ArrayBuffer(byteString.length); const ia = new Uint8Array(ab); for (let i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ab], { type: mimeString }); } } }; </script> ``` ### 3. 解释代码 - `captureDiv`方法:使用`html2canvas`将`div`转换为Canvas,然后将Canvas转换为图片数据URL。 - `uploadImage`方法:将图片数据URL转换为Blob对象,使用`axios`上传服务器。 - `dataURItoBlob`方法:将图片数据URL转换为Blob对象。 ### 4. 服务器端处理 服务器端需要处理上传图片数据。具体的实现取决于服务器端技术栈。以下是一个简单的Node.js示例: ```javascript const express = require('express'); const fileUpload = require('express-fileupload'); const app = express(); app.use(fileUpload()); app.post('/upload', (req, res) => { if (!req.files || Object.keys(req.files).length === 0) { return res.status(400).send('No files were uploaded.'); } const image = req.files.image; const uploadPath = __dirname + '/uploads/' + image.name; image.mv(uploadPath, (err) => { if (err) { return res.status(500).send(err); } res.send('File uploaded!'); }); }); app.listen(3000, () => { console.log('Server is running on port 3000'); }); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值