Express 使用multer和gridfs快速上传文件(文件损坏?)
我正在尝试上传一个文件(图像),上传很好,该文件存储在Mongo中,与原始文件具有相同的内容类型和大小,然后当我尝试下载它时,该文件已损坏,但保持相同的内容类型(如果我上传一个pdf,它会被识别为pdf,如果它是png,它也会被识别,但我无法打开它们)。 我不明白这有什么不对,它非常简单和标准 对于客户端的上传,我使用angular ng upload,对于下载,它是对代码中定义的路由的简单GET请求 编辑: 该文件已经很好地上传到服务器上,所以问题是当我试图从GridFS读取它时。 下载的文件比上传的文件大!所以该文件与原始文件不同,并且已损坏,为什么 这是我的密码Express 使用multer和gridfs快速上传文件(文件损坏?),express,upload,gridfs,multer,gridfs-stream,Express,Upload,Gridfs,Multer,Gridfs Stream,我正在尝试上传一个文件(图像),上传很好,该文件存储在Mongo中,与原始文件具有相同的内容类型和大小,然后当我尝试下载它时,该文件已损坏,但保持相同的内容类型(如果我上传一个pdf,它会被识别为pdf,如果它是png,它也会被识别,但我无法打开它们)。 我不明白这有什么不对,它非常简单和标准 对于客户端的上传,我使用angular ng upload,对于下载,它是对代码中定义的路由的简单GET请求 编辑: 该文件已经很好地上传到服务器上,所以问题是当我试图从GridFS读取它时。 下载的文件
//BACKEND
//ROUTES
var multer = require('multer');
var upload = multer({ dest: './tmp/'});
router.post('/:id/logo',upload.single('file'), uploadFile);
router.get('/:id/logo', getFile);
//Controller
var Grid = require('gridfs-stream');
var mongoose = require('mongoose');
var fs = require('fs');
uploadLogo = function(req, res) {
var gfs = Grid(mongoose.connection.db, mongoose.mongo);
var writeStream = gfs.createWriteStream();
fs.createReadStream(req.file.path).pipe(writeStream);
writeStream.on('close', function(file) {
res.status(200).send({fileId: file._id});
});
writeStream.on('error', function(e) {
res.status(500).send("Could not upload file");
});
}
getFile = function(req, res) {
var gfs = Grid(mongoose.connection.db, mongoose.mongo);
// Check if the file exist
gfs.findOne({ _id: req.params.id}, function(err, file) {
if(err) {
res.status(404).end();
} else if(!file){
res.status(404).end();
} else {
var readstream = gfs.createReadStream({
_id: file._id
});
res.set('Content-Type', file.contentType);
readstream.on('error', function (err) {
res.send(500, err);
});
readstream.on('open', function () {
readstream.pipe(res);
});
}
});
}
//FRONT END
$scope.newFileUpload = function(file) {
$scope.upload(file);
}
$scope.upload = function(file) {
if (file && !angular.isUndefined(file.name)) {
Upload.upload({
url: 'api/' + $scope.myId + '/logo',
fields: {
'type': 'logo'
},
file: file
}).success(function(data, status, headers, config) {
$scope.imageId = data.fileId;
}).error(function(data, status, headers, config) {
console.log('file upload error status: ' + status);
});
}
};
//THE HTML
<div class="drop-box"
ngf-drop
ngf-select
ng-model="imageLogo"
ngf-drag-over-class="dragover"
ngf-allow-dir="true"
accept="image/*"
ngf-pattern="'image/*'"
ngf-change="newFileUpload(imageLogo)"
ngf-multiple="false"
ngf-resize="{width: 200, height: 50}">
Drop logo image here or click to upload</div>
<input type="file" nv-file-select uploader="uploader"/>
//后端
//路线
var multer=需要('multer');
var upload=multer({dest:'./tmp/'});
router.post('/:id/logo',upload.single('file'),uploadFile);
get('/:id/logo',getFile);
//控制器
var Grid=require('gridfs-stream');
var mongoose=require('mongoose');
var fs=需要('fs');
uploadLogo=功能(请求、恢复){
var gfs=电网(mongoose.connection.db,mongoose.mongo);
var writeStream=gfs.createWriteStream();
createReadStream(req.file.path).pipe(writeStream);
writeStream.on('close',函数(文件){
res.status(200).send({fileId:file.\u id});
});
writeStream.on('error',函数(e){
res.status(500).send(“无法上载文件”);
});
}
getFile=函数(请求、恢复){
var gfs=电网(mongoose.connection.db,mongoose.mongo);
//检查文件是否存在
findOne({u id:req.params.id},函数(err,file){
如果(错误){
res.status(404.end();
}如果(!文件){
res.status(404.end();
}否则{
var readstream=gfs.createReadStream({
_id:文件。\u id
});
res.set('Content-Type',file.contentType);
readstream.on('error',函数(err){
res.send(500,err);
});
readstream.on('open',函数(){
readstream.pipe(res);
});
}
});
}
//前端
$scope.newFileUpload=函数(文件){
$scope.upload(文件);
}
$scope.upload=函数(文件){
如果(文件&&!angular.isUndefined(文件名)){
上传({
url:'api/'+$scope.myId+'/logo',
字段:{
“类型”:“徽标”
},
档案:档案
}).success(函数(数据、状态、标题、配置){
$scope.imageId=data.fileId;
}).error(函数(数据、状态、标题、配置){
log('文件上载错误状态:'+状态);
});
}
};
//HTML
将徽标图像放在此处或单击上载
你找到解决方案了吗?我似乎也遇到了同样的问题。我下载的文件更大,而且只损坏了.pdf和.zip-.doc、.jpg和.mp3文件。同样的问题。如果你找到了解决方案,请告诉我。我找不到解决方案,我在许多论坛上询问并尝试了不同的方法,结果总是一样的。N现在我直接上传到AWSS3并从中下载,我不再使用express或GridFS。