遇到了好多坑
1 ajax传输图片要把图片转成base64的 我也不知道为什么 别的方式后台接不到
前端代码
function galleryImg() { //按键调用这个函数来执行从相册选取操作
// 从相册中选择图片
console.log("从相册中选择图片:");
plus.gallery.pick( function(path){ //图片的路径
console.log(path);
compressImage(path)//压缩图片 执行上传 传递给下面的压缩上传函数 从相册的选择是一眼的
}, function ( e ) {
console.log( "取消选择图片" );
}, {filter:"image"} );
}
function carmerImg(){
// var res = cmr.supportedImageResolutions[0];
// var fmt = cmr.supportedImageFormats[0];
var cmr = plus.camera.getCamera();
cmr.captureImage( function( path ){
console.log( "Capture image success: " + path );
compressImage(path)//压缩图片 执行上传
},
function( error ) {
console.log( "Capture image failed: " + error.message );
},
{}
)
}
//压缩图片 上传
function compressImage(path){
plus.zip.compressImage({ //压缩图片的一些操作 可以不压缩 下面的canvans一样压缩
src:path,//原路径
dst:path,//目标路径
quality:100,// 压缩的质量 100原图
overwrite:true,//覆盖源文件
clip:{ //裁切
width:"100%",
height:"100%"
}
},
function(event) { //成功压缩的回掉函数
var imgSrc = event.target;
if(!imgSrc){
mui.toast("照片不见了!请重试...")
return false;
}
var imgLoad = { //这些东西要不要无所谓
src : event.target,
size : event.size,
width : event.width,
height : event.height
}
var img = new Image();
img.src = imgLoad.src; // 传过来的图片路径在这里用。
img.onload = function() {
that = this;
//生成比例
var w = that.width,h = that.height,scale = w / h;
w =640 || w; //480 你想压缩到多大,改这里
h = w / scale;
//生成canvas
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
canvas.width = w;
canvas.height = h;
ctx.drawImage(that, 0, 0, w, h);
var base64 = canvas.toDataURL('image/jpg', 1 );
//console.log(base64)
var data = {};
data.base64 = base64;
data.name = userInfo.userId; //这些可以写你想传给后台的信息
console.log("上传对象" + JSON.stringify(data.name))
plus.nativeUI.showWaiting("图片拼命上传中...");
mui.ajax('http://'+Url+':8888/userImg',{ //你的服务端地址
data:data,
timeout:5000,
headers:{"enctype" : "multipart/form-data"}, //这个头部的应该可以不要
crossDomain:true,
type:"POST" ,
error:function(xhr, type, errorThrown){
plus.nativeUI.closeWaiting()
mui.toast(xhr.responseText)
mui('#sheet1').popover('toggle');
},
success:function(data, status, xhr){
$('.userimg').attr("src", imgSrc)
plus.nativeUI.closeWaiting()
mui.toast(xhr.responseText)
mui('#sheet1').popover('toggle');
}
} )}
},function(error) {
alert("压缩上传失败了奥,请重试...");
});
}
mongodb $set:{key, value} 设置数据的时候 如果被设置数据没有对应的key 它会创建这个key value 有这个key 会直接覆盖
mongodb upadte ({key: value}) 查询 key value 的数据类型也要对应 不然 查不到
nodejs的base64通过Buffer对象去解析存储
如果出现 request entity too larger 记得修改bodyparser的limit
后端代码
var express = require('express');
var app = express();
var fs =require('fs');
var bodyParser = require('body-parser');
var multipart = require('connect-multiparty'); //在处理模块中引入第三方解析模块
var multipartMiddleware = multipart();
var MongoClient = require('mongodb').MongoClient;
app.use(bodyParser.urlencoded({ extended: true, limit:"50mb" })); //修改上传的显示
app.use(bodyParser.json({limit:"50mb"}));
app.use(express.static('public'))
app.use(multipart({uploadDir:'./public' }));//设置上传文件存放的地址。
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",' 3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
//头像上传
app.post('/userImg', multipartMiddleware, function(req, res){ //引用connect - muitipart 模块
console.log(req.body.name)
// var parseInt()
//不要把base64直接通过query.body传过来 不然很麻烦 转格式什么的
var base64 = req.body.base64.replace(/^data:image\/\w+;base64,/, "");//去掉图片base64码前面部分data:image/png;base64//
var dataBuffer = new Buffer(base64, 'base64'); //把base64码转成buffer对象,
console.log('dataBuffer是否是Buffer对象:'+Buffer.isBuffer(dataBuffer));
//验证路径是否存在
fs.exists("public/img/userImg/"+ req.body.name + "/", function(exits){ //验证路径 这些都是你放图片的路径 存在的话就直接覆盖 不存在的话创建路径再覆盖
if(exits == true) {
console.log("路径存在")
fs.writeFile("public/img/userImg/"+ req.body.name + "/" + "userHeaderImg.jpg", dataBuffer, function(err){ //写入文件
if(err){
res.status(500)
res.send({success:"上传图片失败,路径覆盖出错"})
} else {
MongoClient.connect('mongodb://dbadmin:li19941217@localhost:27017/', function(err, db){ //这里的逻辑我写的是如果上传了头像 更新用户的头像数据 然后本地的客户端就会获取这个值来更新头像 根据自己的逻辑写
var userDB = db.db("ergou");
userDB.collection("users", function(err, users){
// console.log("查找" +{userId:req.body.name} )
// console.log(typeof 0)
// console.log(typeof parseInt(req.body.name))
// users.find({userId: parseInt(req.body.name) }, function(err, items){
// items.toArray(function(err, item){
// console.log(item)
// })
// })
/*记住数字的查询要变成数字 不能是字符串 因为在mongo里会当成 ‘0’*/
users.update({userId: parseInt(req.body.name)}, {$set:{headerImg:true}}, function(err, results){ //这里注意了 这里的查询的数据类型要和你的后台存储的类型一致
// console.log(results)
if(err){
res.status(500)
res.send({success:"保存到数据库的过程中出错了,请重试"})
} else {
res.status(200)
res.send({success:"图片上传成功"})
}
})
})
})
}
})
} else { //如果路径不存在 建立路径 并且写入图
fs.mkdir("public/img/userImg/"+ req.body.name , function(err){
if(err) {
console.log("创建目录失败")
res.status(500);
res.send({success:"保存图片到服务器的过程失败了"})
} else {
fs.writeFile("public/img/userImg/"+ req.body.name +"/"+ "userHeaderImg.jpg", dataBuffer, function(err){
MongoClient.connect('mongodb://dbadmin:li19941217@localhost:27017/', function(err, db){
var userDB = db.db("ergou");
userDB.collection("users", function(err, users){
// users.find({userId:req.body.name}, function(err, items){
// items.toArray(function(err, item){
// console.log(item)
// })
// })
users.update({userId: parseInt(req.body.name)}, {$set:{headerImg:true}}, function(err, results){//$set 有酒更新 没有就创建
// console.log(results)
if(err){
res.status(500)
res.send({success:"保存到数据库的过程中出错了,请重试"})
} else {
res.status(200)
res.send({success:"图片上传成功"})
}
})
})
})
})
}
})
} //else 结束
})//路径的验证结束
//console.log(req.body.base64)
})