node.js實(shí)現(xiàn)多圖片上傳實(shí)例
先上效果圖:
這是我當(dāng)時(shí)做多圖片的代碼,拿出來(lái)給大家借鑒一下(有些地方需要親們自己改一下,大方向是對(duì)的)
總共涉及到三處文件(常規(guī)來(lái)說(shuō))
1.路由入口文件(我這里是/routes.js,很多時(shí)候會(huì)在/app.js)
//添加美食
app.all('/add', users.add);
2.路由控制器文件(我這里是/routes/users.js)
//添加美食
exports.add = function (req, res) {
if (req.method == "GET") {
var user = {};
if(req.session.user){
user = req.session.user;
}
res.render("users/food_add", {title:'發(fā)布美食-'+config.name,name:config.name,user:user});
} else if (req.method == "POST") {
//獲取數(shù)據(jù)
var x = req.body.x;
var y = req.body.y;
var cat_id = req.body.cat_id;
var cat_name = req.body.cat_name;
var address = req.body.address;
var title = req.body.title;
var desc = req.body.desc;
var content = req.body.content;
var pics = '';
var price = req.body.price;
var tags = req.body.tags;
var add_time = Date.parse(new Date())/1000;
var support = 0;
var uid = req.body.uid;
//處理圖片上傳
//console.dir(req.files);
var file_obj = req.files.pics;
//console.log(file_obj.length);
var file_obj2 = [];
for(var i=0;i<file_obj.length;i++){
if(file_obj[i].name){
file_obj2.push(file_obj[i]);
}
}
var length = file_obj2.length;
if(length>0){
file_obj2.forEach(function(item,index){
if(item.path){
var tmpPath = item.path;
var type = item.type;
var extension_name = "";
//移動(dòng)到指定的目錄,一般放到public的images文件下面
//在移動(dòng)的時(shí)候確定路徑已經(jīng)存在,否則會(huì)報(bào)錯(cuò)
var tmp_name = (Date.parse(new Date())/1000);
tmp_name = tmp_name+''+(Math.round(Math.random()*9999));
//判斷文件類(lèi)型
switch (type) {
case 'image/pjpeg':extension_name = 'jpg';
break;
case 'image/jpeg':extension_name = 'jpg';
break;
case 'image/gif':extension_name = 'gif';
break;
case 'image/png':extension_name = 'png';
break;
case 'image/x-png':extension_name = 'png';
break;
case 'image/bmp':extension_name = 'bmp';
break;
}
var tmp_name = tmp_name+'.'+extension_name;
var targetPath = 'public/images/' + tmp_name;
console.log(tmpPath);
//將上傳的臨時(shí)文件移動(dòng)到指定的目錄下
fs.rename(tmpPath, targetPath , function(err) {
if(err){
throw err;
}
if(pics){
pics += ','+tmp_name;
}else{
pics += tmp_name;
}
//判斷是否完成
//console.log(index);
//刪除臨時(shí)文件
fs.unlink(tmpPath, function(){
if(err) {
throw err;
}else{
if((index+1)==length){
console.log(targetPath);
//上傳處理完成
//數(shù)據(jù)
var data = {
x:x,//經(jīng)度
y:y,//維度
cat_id:cat_id,//分類(lèi)id
cat_name:cat_name,//分類(lèi)名稱(chēng)
address:address,//地址
title:title,//標(biāo)題
desc:desc,//簡(jiǎn)介
content:content,//內(nèi)容
pics:pics,//圖片字段,以','隔開(kāi)多張圖片
price:price,//價(jià)格
tags:tags,//標(biāo)簽 以','隔開(kāi)多個(gè)
add_time:add_time,//支持度
support:support,//支持度 默認(rèn)為0
uid:uid//用戶(hù)id 可匿名
};
food_preDao.insert(data, function (err, food) {
if(err){
res.json({err:100,content:'數(shù)據(jù)庫(kù)錯(cuò)誤'});
}else{
res.json({err:0,content:'發(fā)布成功!',data:food});
}
});
}
}
});
});
}
});
}else{
//沒(méi)有圖片
//數(shù)據(jù)
var data = {
x:x,//經(jīng)度
y:y,//維度
cat_id:cat_id,//分類(lèi)id
cat_name:cat_name,//分類(lèi)名稱(chēng)
address:address,//地址
title:title,//標(biāo)題
desc:desc,//簡(jiǎn)介
content:content,//內(nèi)容
pics:pics,//圖片字段,以','隔開(kāi)多張圖片
price:price,//價(jià)格
tags:tags,//標(biāo)簽 以','隔開(kāi)多個(gè)
add_time:add_time,//支持度
support:support,//支持度 默認(rèn)為0
uid:uid//用戶(hù)id 可匿名
};
food_preDao.insert(data, function (err, food) {
if(err){
res.json({err:100,content:'數(shù)據(jù)庫(kù)錯(cuò)誤'});
}else{
res.json({err:0,content:'發(fā)布成功!',data:food});
}
});
}
}
};
3.視圖文件(我這里是/views/users/food_add.ejs)
<style>
.upload_item{ width: 50px; height: 45px; overflow: hidden;border: 2px dashed #bfbfbf; float: left;margin-right: 10px;}
.upload_item_add{ width: 50px; height: 45px; display: block; line-height: 42px; text-align: center; font-size: 30px; cursor: pointer;}
.upload_input{ }
</style>
<script>
var ADD = {
upload_click:function(obj){
$(obj).parent().children().eq(1).click();
},
upload_change:function(obj){
var path;
path=$(obj).val(); //C:\Documents and Settings\hud\桌面\AddFile.jpg
var aa;
aa=path.split('.');
//alert(aa[aa.length-1]); //jpg 結(jié)果
var name;
name=path.split('\\');
var bb=name[name.length-1];
//alert(bb.substr(0,bb.indexOf('.'))); //AddFile 結(jié)果
$(obj).parent().children().eq(0).css('fontSize','12px');
$(obj).parent().css('borderStyle','solid');
$(obj).parent().children().eq(0).html(bb.substr(0,bb.indexOf('.')));
if($(obj).parent().attr('index')==1){//新增
var html = '<div class="upload_item" index="1"><span class="upload_item_add" onclick="ADD.upload_click(this)">+</span><input type="file" name="pics" id="pics" class="upload_input" onchange="ADD.upload_change(this)" /></div>';
$('#upload_box').append(html);
$(obj).parent().attr('index','0');
}
}
};
</script>
<form method="post" action="/add" enctype="multipart/form-data">
<table>
<tr>
<td>經(jīng)度:</td><td><input type="text" name="x" id="x" /></td>
</tr>
<tr>
<td>維度:</td><td><input type="text" name="y" id="y" /></td>
</tr>
<tr>
<td>分類(lèi):</td><td><select name="cat_id"><option value="1">分類(lèi)1</option></select></td>
</tr>
<tr>
<td>地址:</td><td><input type="text" name="address" id="address" /></td>
</tr>
<tr>
<td>標(biāo)題:</td><td><input type="text" name="title" id="title" /></td>
</tr>
<tr>
<td>簡(jiǎn)介:</td><td><input type="text" name="desc" id="desc" /></td>
</tr>
<tr>
<td>內(nèi)容:</td><td><input type="text" name="content" id="content" /></td>
</tr>
<tr>
<td>圖片:</td><td id="upload_box"><div class="upload_item" index="0" style="display:none;"><span class="upload_item_add" onclick="ADD.upload_click(this)">+</span><input type="file" name="pics" id="pics" class="upload_input" onchange="ADD.upload_change(this)" /></div><div class="upload_item" index="1"><span class="upload_item_add" onclick="ADD.upload_click(this)">+</span><input type="file" name="pics" id="pics" class="upload_input" onchange="ADD.upload_change(this)" /></div></td>
</tr>
<tr>
<td>價(jià)格:</td><td><input type="text" name="price" id="price" /></td>
</tr>
<tr>
<td>標(biāo)簽:</td><td><input type="text" name="tags" id="tags" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交" /></td>
</tr>
</table>
</form>
相關(guān)文章
Node快速切換版本、版本回退(降級(jí))、版本更新(升級(jí))
這篇文章主要介紹了Node快速切換版本、版本回退(降級(jí))、版本更新(升級(jí)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建
這篇文章主要為大家介紹了Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Node.js創(chuàng)建一個(gè)Express服務(wù)的方法詳解
這篇文章主要介紹了Node.js創(chuàng)建一個(gè)Express服務(wù)的方法,結(jié)合實(shí)例形式分析了node.js創(chuàng)建Express服務(wù)的具體步驟、實(shí)現(xiàn)方法及相關(guān)操作技巧,需要的朋友可以參考下2020-01-01Node.js處理I/O數(shù)據(jù)之使用Buffer模塊緩沖數(shù)據(jù)
這篇文章介紹了Node.js使用Buffer模塊緩沖數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07node.js模擬實(shí)現(xiàn)自動(dòng)發(fā)送郵件驗(yàn)證碼
這篇文章主要為大家介紹了node.js模擬實(shí)現(xiàn)自動(dòng)發(fā)送郵件驗(yàn)證碼的實(shí)例過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04用node擼一個(gè)監(jiān)測(cè)復(fù)聯(lián)4開(kāi)售短信提醒的實(shí)現(xiàn)代碼
這篇文章主要介紹了用node擼一個(gè)監(jiān)測(cè)復(fù)聯(lián)4開(kāi)售短信提醒的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04使用Nodejs?實(shí)現(xiàn)一個(gè)簡(jiǎn)單的?Redis客戶(hù)端(推薦)
在nodejs中支持TCP連接的是net模塊,?其中使用createConnection(config)或者直接new?Socket(config)來(lái)初始化一個(gè)TCP連接,這篇文章主要介紹了用Nodejs?實(shí)現(xiàn)一個(gè)簡(jiǎn)單的?Redis客戶(hù)端,需要的朋友可以參考下2022-11-11npm?install安裝過(guò)程報(bào)錯(cuò)的實(shí)用解決辦法
最近做項(xiàng)目遇到npm install 的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于npm?install安裝過(guò)程報(bào)錯(cuò)的實(shí)用解決辦法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06node跨域轉(zhuǎn)發(fā) express+http-proxy-middleware的使用
這篇文章主要介紹了node跨域轉(zhuǎn)發(fā) express+http-proxy-middleware的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05