var fs= require('fs')
var imageFile = dataUrl.replace(/^data:image\/\w+;base64,/, "");
var imageBuffer = new Buffer(imageFile,'base64');
fs.writeFileSync('./ap.png',imageBuffer);

目前流行的“你画我猜”应用,你有没有想过使用HTML5来实现过?那么不可避免的需要解决canvas保存图片到硬盘或mongodb之类的数据库。本文主要介绍使用nodejs将html5 canvas base64编码图片保存为文件,同时提供两种解决方案。

html5 canvas属于客户端API,没有权限去保存图片到硬盘,只有canvas . toDataURL()这一个接口可导出画布的base64编码,以提供给服务端进行处理保存,据我所知.net和php都有方法或类来进行简单的处理保存。nodejs呢?是的,没错!nodejs同样有能力来保存base64编码的图片。

解决方案一:

使用new Buffer来创建对应编码的缓冲,通过fs模块将Buffer写成一个文件。

优点:简单易用,无需其它模块的支持。

缺点:不能对图片的尺寸,水印,压缩,格式等进行处理。

注意点:

1、new Buffer接收到base64编码,不能带data:URL,而使用canvas . toDataURL()导出的base64编码会带data:URL,所以需要先过滤掉

类似这样的一段“data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0”

需过滤成:“iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0”

2、’binary’ – 一种只使用每个字符前8个字节将原始的二进制数据编码进字符串的方式。这个方式已经废弃,应当尽量使用buffer 对象。这个编码将会在未来的node 中删除。

看到有人把base64声明的Buffer再转换成binary,这个是完全没必要的。

3、生成的图片有size变化,但是打开后是一个无效的图像,这个看本文的第三点。

使用express搭建的/upload (POST)上传保存接口,完成代码如下:

var express = require('express');
var fs = require("fs");
var app = module.exports = express();
//配置
app.configure(function(){
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('keyboard cat'));
app.use(express.session());
app.use(app.router);
app.use(express.static(__dirname + '/up')); //静态文件目录
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
//保存base64图片POST方法
app.post('/upload', function(req, res){
//接收前台POST过来的base64
var imgData = req.body.imgData;
//过滤data:URL
var base64Data = imgData.replace(/^data:image\/\w+;base64,/, "");
var dataBuffer = new Buffer(base64Data, 'base64');
fs.writeFile("out.png", dataBuffer, function(err) {
if(err){
res.send(err);
}else{
res.send("保存成功!");
}
});
});
if (!module.parent) {
app.listen(8000);
console.log('Express started on port 8000');
}
解决方案二:

使用node-canvas模块进行图片处理和保存。

(node-canvas安装见我的另一篇博文:http://www.2fz1.com/?p=246)

优点:能对图片像html5 canvas一样进行处理,尺寸调整、水印、图片反转色、格式转换

缺点:需安装模块支持、当base64编码有误不能解析成图片时会报错并停止nodejs服务。

注意点:canvas透明背景,默认为黑色;使用base64给img.src赋值时,需带上data:URL

使用express搭建的/upload (POST)上传保存接口,完成代码如下:

var Canvas = require('canvas'); //需安装canvas模块
var express = require('express');
var fs = require("fs");
var app = module.exports = express();
//配置
app.configure(function(){
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('keyboard cat'));
app.use(express.session());
app.use(app.router);
app.use(express.static(__dirname + '/up')); //静态文件目录
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.post('/upload', function(req, res){
var base64Data = req.body.imgData;
var img = new Canvas.Image;

img.onload = function(){var w = img.width;var h = img.height;var canvas = new Canvas(w, h);var ctx = canvas.getContext('2d');ctx.drawImage(img, 0, 0);var out = fs.createWriteStream(__dirname + '/crop.jpg');var stream = canvas.createJPEGStream({bufsize : 2048,quality : 80});stream.on('data', function(chunk){out.write(chunk);});stream.on('end', function(){out.end();res.send("上传成功!");});
}img.onerror = function(err){res.send(err);
}img.src = base64Data;

});
if (!module.parent) {
app.listen(8000);
console.log('Express started on port 3000');
}
容易出现的错误(base64编码中,不容忽视的“+”号)

1、如果canvas没有任何像素,则返回值为:“data:,”,这是最短的data:URL,代码中最好做一下保护。

2、使用解决方案一实现图片保存,生成的图片有size,但是打开后却是不能识别的无效图像。

使用解决方案二实现图片保存,nodejs直接报错,并且服务挂掉。

原因:

这个问题,花了我很长时间才找到原因,根本原因是base64编码,使用express接收POST值后,base64编码字符串中的“+”号被替换成空格了,引起编码出错,img.src = base64Data;直接把nodejs服务挂掉。如果你出现类似问题,请console.log(base64Data);看字符串是否有空格。

解决办法:

将空格替换回“+”号

var base64Data = imgData.replace(/\s/g,"+");

转载于:https://www.cnblogs.com/mayidudu/p/6062112.html

base64 convert to file相关推荐

  1. //BASE64解码成File文件

    //BASE64解码成File文件public static void base64ToFile(String base64, String destPath,String fileName) {Fi ...

  2. unpacking error : failed to extract...: failed to convert whiteout file... operation not permitted

    unpacking error : failed to extract-: failed to convert whiteout file- operation not permitted 问题背景: ...

  3. 【JS】前端base64转图片File对象

    码 base64ToFile.js /** * base64转图片File * @param {String} base64 图片base64 * @param {String} fileName 图 ...

  4. vue中调用摄像头拍照,并把拍照的base64格式转换为file传递后台

    需求: 在vue项目中使用摄像头拍摄照片传递,进行上传,如果上传成功可以获取到url链接,进行下一步的操作 内容梳理 1.首先进入页面打开摄像头 2.点击手动拍照进行拍摄照片,实时显示拍照效果 3.拿 ...

  5. base64转化字节流 js_js - blob流和base64,以及file和base64的相互转换

    file和base64 1.file文件转换为base64,得到base64格式图片 var reader = new FileReader(); reader.readAsDataURL(this. ...

  6. img 格式相互转换 url, base64,blob, file

    正常向后端传的文件就是file格式,存储到文件服务器 url -> base64  -> file url -> blob -> file url -> base64 - ...

  7. base64图片转file的处理

    注意:后端返回的base64图片,有的没有code,可能会遭遇响应拦截器拦截,要去主动解除限制 request.js中 //数据处理错误接口}else if(res.code == 400){mess ...

  8. 人脸检测,身份证扫描调三方接口获取图片base64路径转file,存入数据库(Vue)

    <template> <div class="PersonInfoAuthPage"> <Header headerTitle="个人信息认 ...

  9. 【前端图片转化】 base64格式 转为 File文件类型

    下面的函数能将base664格式 用于已知bseae64 转File格式上传 求点赞!! 关注!! 收藏 !! base64格式的图片不能直接上传到oss图片服务器的,需要转换成file文件流的形式上 ...

最新文章

  1. [转]MySQL实现分页查询
  2. 功能测试工作的一点总结
  3. Git本地分支版本过低导致的push错误 error: failed to push some refs to ... 及后续amend
  4. 自适应页面 移动端获取焦点自动放大_专业 | 惠检LIMS系统:手机移动应用(MA)...
  5. 微信端php 开发技术要求,微信第三方平台开发详解——PHP版
  6. leetcode 4 --- 寻找两个有序数组的中位数
  7. PowerDesigner导出Report通用报表
  8. ubuntu安装mysql5.7.17_ubuntu 16.04安装mysql-server_5.7.17
  9. okhttp初识拦截器
  10. 蚂蚁课堂二期视频(每特学院二期)
  11. php7isapi,Windows7 IIS7下以FastCgi和ISAPI方法安装配置PHP5教程
  12. R studio做加权cox回归分析时候总是报错,急求,非常感谢老师
  13. 交换机和路由器的区别计算机网络,交换机和路由器有什么区别?路由器与交换机的区别知识...
  14. [随记] 注释//TODO的作用
  15. PhpMyWind储存型XSS漏洞练习(CVE-2017-12984)
  16. matlab绘制加速度曲线,加速度积分得到速度和位移的问题小结
  17. 利用cookie传值
  18. 腾讯手游助手吃鸡一直服务器繁忙,腾讯手游助手吃鸡手游常见问题解决办法介绍...
  19. 不安分的管家——Jenkins
  20. bzoj3663/4660CrazyRabbit bzoj4206最大团

热门文章

  1. Android 判断用户2G/3G/4G移动数据网络
  2. hadoop-mapreduce在maptask执行分析
  3. 长沙戴维营教育iOS开发面试题周刊
  4. 关于大小端、位域的一些概念详解
  5. python常用文本处理功能
  6. 一步一步手绘Spring DI运行时序图(Spring 自动装配之依赖注入)
  7. 蓝桥杯 ADV-121 算法提高 高精度加法
  8. [Java] 蓝桥杯ALGO-30 算法训练 入学考试
  9. [Java] 蓝桥杯 BASIC-1 基础练习 闰年判断
  10. 使用nvl就不能groupby了吗_现在的手机大部分都不能换电池,使用1至2年就需要更换吗?...