在之前的博客《Node.js+express+MySQL使用七牛云實現的用戶頭像修改》,已經實現了在MUI框架或者《 Ajax實現圖片上傳》。之前都是使用Node.js寫的一個后臺接口,就可以使用ajax上傳了,在MUI框架中的mui.ajax其實還是ajax。在《Node.js+express+MySQL使用七牛云實現的用戶頭像修改》我已經詳細的說了怎么配置七牛了,這里不再說明。
準備工作
配置uploadFile合法域名
在做微信小程序的圖片上傳之前我們需要先配置uploadFile的合法域名。這個可以看《微信小程序開發(一)新建小程序項目》的服務器配置部分。
看小程序文檔
看小程序文檔—wx.uploadFile,看文檔主要是看小程序給的api是怎么使用的。在使用wx.uploadFile之前需要先使用wx.chooseImage(OBJECT)這個api,因為我們需要先選擇圖片。
代碼實現
有了上面的準備工作后我們就可以實際操作了。
小程序端的實現
小程序端的實現其實很簡單,一個事件去出發選擇上傳操作。
-
wx.chooseImage({
-
count: 9, // 默認9
-
sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,默認二者都有
-
sourceType: ['album', 'camera'], // 可以指定來源是相冊還是相機,默認二者都有
-
success: function (res) {
-
// 返回選定照片的本地文件路徑列表,tempFilePath可以作為img標簽的src屬性顯示圖片
-
var tempFilePaths = res.tempFilePaths;
-
wx.uploadFile({
-
url: 'https://www.hgdqdev.cn/api/upload2',
-
filePath: tempFilePaths[0],
-
name: 'file',
-
header: {
-
'content-type': 'multipart/form-data'
-
},
-
success: function (res) {
-
var data = res.data
-
console.log(res);
-
}
-
})
-
}
-
})
這里我也開放我的兩個圖片上傳的接口:
-
【ajax版本】https://www.hgdqdev.cn/api/upload
-
【小程序版本】https://www.hgdqdev.cn/api/upload2
這兩個接口的使用大家可以看上線的文章,遇見接口不能使用時可以聯系我,我開服務器。
服務端的實現
在實現服務端,我們需要使用一個新的模塊multer,關于這個模塊的使用,大家可以看文檔就是了。 代碼:
-
// 微信小程序 圖片上傳
-
var multer = require('multer')
-
var upload = multer({ dest: './tmp/' })
-
// 圖片上傳
-
router.all('/api/upload2', upload.single('file'), function(req, res, next){
-
// 文件路徑
-
var filePath = './tmp/' + req.file.filename;
-
// 文件類型
-
var fileType = req.file.mimetype;
-
var lastName = '';
-
switch (fileType){
-
case 'image/png':
-
lastName = '.png';
-
break;
-
case 'image/jpeg':
-
lastName = '.jpg';
-
break;
-
default:
-
lastName = '.png';
-
break;
-
}
-
// 構建圖片名
-
var fileName = Date.now() + lastName;
-
console.log(req.file);
-
// 圖片重命名
-
fs.rename(filePath, fileName, (err) => {
-
if (err) throw err;
-
// 七牛上傳
-
var putPolicy = new qiniu.rs.PutPolicy(bucket+":" + fileName);
-
var token = putPolicy.token();
-
var extra = new qiniu.io.PutExtra();
-
qiniu.io.putFile(token, fileName, fileName, extra, function(err, ret) {
-
if(!err) {
-
// 上傳成功, 處理返回值
-
// ret.key 是圖片的名字
-
var imageSrc = 'http://o9059a64b.bkt.clouddn.com/' + ret.key;
-
res.end(JSON.stringify({status:'100',msg:'上傳成功',imageUrl:imageSrc}));
-
} else {
-
// 上傳失敗, 處理返回代碼
-
res.end(JSON.stringify({status:'101',msg:'上傳失敗',error:ret}));
-
}
-
// 上傳后刪除本地圖片
-
fs.unlinkSync(fileName);
-
});
-
});
-
})
后端代碼其實也很簡單的。理清思路就好做了。
效果圖

這里寫圖片描述 手機不能搞gif圖,就電腦截屏了,這個在微信預覽是一樣的。
|