目前项目中需要用到上传图片,工程师用angular写的网站,在上传图片用的是angular-file-upload插件。服务是用node写的,就是在点击上传的时候,后台总是获取不到任何的信息。上传图片到服务器这中间大概是有一个js里写代码去做一些判断或者处理的,今天谷歌了一天也没找到什么有用的信息,下面我贴一下简单的代码:
html:
<div class="wi-view-row-right">
<div class="wi-view-row-label-norm">放款凭证 :</div>
<div class="wi-view-row-content-norm">
<input type="text" class="wi-view-row-filename" readonly="readonly" ng-model="fileItem.name" />
</div>
<a href="javascript:;" class="wi-view-row-filelink">
<input type="file" accept="image/bmp, image/png, image/tiff, image/gif, image/jpeg" name="certificate" nv-file-select uploader="uploader" ng-click="clearItems()"/>浏览
</a>
</div>
js:
/* upload start */
$scope.uploadStatus = false; //定义上传后返回的状态,成功获失败
var uploader = $scope.uploader = new FileUploader({
url: '/api/asset/billUpload',
method: 'POST',
queueLimit: 1, //文件个数
removeAfterUpload: true, //上传后删除文件
formData:[
{
loginId: "123"
}
]
});
$scope.clearItems = function(){ //重新选择文件时,清空队列,达到覆盖文件的效果
uploader.clearQueue();
console.log("clear");
};
uploader.onAfterAddingFile = function(fileItem) {
$scope.fileItem = fileItem._file; //添加文件之后,把文件信息赋给scope
//能够在这里判断添加的文件名后缀和文件大小是否满足需求。
console.log("onAfterAddingFile");
};
uploader.onSuccessItem = function(fileItem, response, status, headers) {
$scope.uploadStatus = true; //上传成功则把状态改为true
console.log("onSuccessItem");
};
uploader.onCompleteItem = function(fileItem, response, status, headers) {
console.log("onCompleteItem");
};
uploader.onErrorItem = function(fileItem, response, status, headers) {
console.log("onErrorItem");
};
//确认方法中需要uploader.uploadAll();//上传图片
/* upload end */
//确认成功
$scope.intendSuccess = function () {
//发送确认成功的请求
uploader.uploadAll();//上传图片
});
};
这里面有传数据loginID,想在服务端打印日志的时候获取到的,但是文件什么的一样都获取不到。
node端代码不怎么会写,想知道大家都是怎么写node端代码来获取到文件是否上传成功。
这个是之前别的工程里面用到的uploadUtils.js代码
var fs = require("fs");
var config = require('./config');
var path = require("path");
var imageHandler = require("./imageCheck/imageCheck");
/**
* Create file upload
*/
exports.create = function (req, res, next) {
console.log("开始进入方法");
console.log(req);
var ticketNo = req.body.ticketNo;
var outletsCode = req.body.outletsCode;
var date = req.body.date;
var isPositive = req.body.isPositive;
var dir = config.tmp;
console.log("-------------dir-----------"+dir);
var tem_path = req.files.file.path;
console.log("第二步了");
//if (isPositive == 'yes') {
console.log('-------------------check bill start----------------');
imageHandler.checkImage(tem_path,function(err , code){
console.log('image check result:'+code);
if(err){
return res.json({
retCode: '1000040',
retMsg: 'check failed'
});
}
if(code <= 11)
{
console.log('----------------------:' + dir);
fs.exists(path.join(dir, outletsCode), function (exists) {
console.log(exists ? "outletsCode dir has already created" : "outletsCode dir is not exist !");
if (exists) {
fs.mkdir(path.join(dir, outletsCode, ticketNo + '_' + date), function (err) {
if (err) {
return res.json({
retCode: '1000020',
retMsg: 'mkdir failed'
});
} else {
console.log('mkdir succeed');
moveFile(isPositive);
}
})
} else {
fs.mkdir(path.join(dir, outletsCode), function (err) {
if (err) {
return res.json({
retCode: '1000020',
retMsg: 'mkdir failed'
});
} else {
fs.mkdir(path.join(dir, outletsCode, ticketNo + '_' + date), function (err) {
if (err) {
return res.json({
retCode: '1000020',
retMsg: 'mkdir failed'
});
} else {
console.log('mkdir succeed');
moveFile(isPositive);
}
})
}
})
}
});
}
if(code > 11)
{
fs.unlink(tem_path, function(err) {
if (err) throw err;
});
return res.json({
retCode: '1000030',
retMsg: ' Picture is not legitimate '
});
}
});
//} else {
//
// moveFile(isPositive);
//}
function moveFile(isPositive) {
console.log("123321");
var oldPath = req.files.file.path;
var name1 = req.files.file.name;
var arr = name1.split(".");
var type = arr[arr.length-1];
if (isPositive == 'yes') {
var newPath = path.join(dir, outletsCode, ticketNo + '_' + date, ticketNo+'_F_0.'+type);
} else {
var itemIndex = req.body.itemIndex;
var newPath = path.join(dir, outletsCode, ticketNo + '_' + date, ticketNo+'_B_'+itemIndex+'.'+type);
}
fs.rename(oldPath, newPath, function (data) {
if (data) {
console.log('file upload failed')
console.log(data);
return res.json({
retCode: '1000010',
retMsg: 'upload failed',
siteFilePath: newPath
});
}
else {
return res.json({
retCode: '000000',
retMsg: 'succeed',
siteFilePath: newPath
});
}
})
}
};
下面是涉及到的一个imageCheck.js的代码
var child_process = require('child_process');
var path = require('path');
var exec = child_process.exec;
var basePath = path.join(__dirname, 'testImage.jar');
var imageChecker = {};
imageChecker.checkImage = function (image, done) {
console.log("imageChecker.checkImage");
last = exec('java -jar ' + basePath + ' ' + image);
var result = '', err = '';
last.stdout.on('data', function (data) {
//console.log('标准输出:' + data);
result += data;
});
// 捕获标准错误输出并将其打印到控制台
last.stderr.on('data', function (data) {
//console.log('标准错误输出:\n' + data);
err += data;
});
last.on('exit', function (code) {
//console.log('子进程已关闭,代码:' + code);
done(err, result);
});
};
module.exports = imageChecker;
还有路由代码
//TODO
router.use('/billUpload', function (req, res, next) {
uploadUtil.create(req,res, function (err, data) {
console.log("------------------------------");
console.log(4343424324343);
console.log("------------------------------");
//console.log(res);
if(err){
res.sendStatus(500);
}
})
});
到最后打印日志的时候,会发现console的很多东西都打不出来,可能问题说的有点乱,因为我对这一块了解的也是很浅显,希望有懂得人能帮忙指导下。主要的还是node服务这块的代码怎么写。
这个问题目前还没人来回答,我就自问自答一下吧,imageCheck.js中缺少引入fs,
var fs = require("fs");
所以才会出现这样的问题,但是后来发现项目中并不需要用到checkimage,所以直接吧imagecheck拿掉了,然后在uploadUtil.js中代码修改了下,把用imagecheck验证的直接拿掉了。创建目录存图片什么的,就直接修改成下面这样了。希望对看到这个问题的人有点用处吧。