3

我正在使用angular-file-upload,当我上传不是 txt 的文档(例如图片、pdf 或 doc 文档)并尝试下载它时,该文件与我上传的文件不同(采取看看图片),我不确定这是否是因为上传文件时编码错误..

在此处输入图像描述 左边的文件是原始文件。

客户端:

var uploader = $scope.uploader = new FileUploader({
   scope: $scope,
   url: '/file/upload/',
   method:'POST',
   headers: {
    'X-XSRF-TOKEN': 'some token'
   }
});

$scope.upload = function(){
    uploader.queue.forEach(function(item){
        item.formData = [
        {'filename': 'friendlyName' },
        {'objectType': 'element' },
        {'elementId': 'someId'}
        ];
    });
    uploader.uploadAll();
};

后台POST...

在这里,busboy 文件事件中的编码变量是'7bit' ..

exports.uploadDocument = function(req,res){
    req.pipe(req.busboy);
    var doc = new DocumentModel();

    req.busboy.on('file',function(fieldname, file, filename, encoding, contentType){
        doc.contentType = contentType;
        doc.encoding= encoding;
        doc.filename= filename;
        doc.content = '';
        doc.size = 0;
        file.on('data',function(data){
            doc.content += data;
            doc.size += data.length;
        });
    });

    //updating req.body with busboy parameters
    req.busboy.on('field',function(fieldname,val){
        req.body[fieldname] = val;
    });

    req.busboy.on('finish', function() {
        if(req.body.hasOwnProperty('filename')){
            doc.friendlyName = req.body.filename;
        }
        if(req.body.hasOwnProperty('objectType')){
            doc.reference.objectType = req.body.objectType;
        }
        if(req.body.hasOwnProperty('elementId')){
            doc.reference._id= req.body.elementId;
        }
        doc.save(function(err,savedFile){
            if(err){
                res.json(500,err.message);
            }else{
                res.json(200,doc);
            }
        });
    });
};

后端:获取...

exports.downloadDocument = function(req,res){
    var id = mongoose.Types.ObjectId(req.params.documentId);
        DocumentModel.findOneAsync({_id:id}).then(
        function(doc){
            console.log('doc', doc);
            if(doc!==undefined){
                DocumentModel.getFile(doc.fileInfoId).then(function(binaryData){
                    res.setHeader('x-timestamp', Date.now());
                    res.setHeader('x-sent',true);
                    res.setHeader('Content-disposition', 'attachment; filename=' + doc.filename);
                    res.setHeader('Content-Type',doc.contentType);
                    res.send(binaryData);   
                }).error(function(e){
                    res.status(500).send(e.message);
                });
            }
            else{
                res.status(404).send('file not found.');
            }
        });
};

如何设置正确的编码?或者不是编码问题?

这是我尝试查看下载的文件时遇到的错误。 在此处输入图像描述

提前致谢。

PD:我使用 gridFS 将文档存储在 mongoDB 中。

4

1 回答 1

2

您通过将数据缓冲区附加到doc.content(这是一个字符串)隐式地将二进制数据转换为 UTF-8。

您可能应该做的是确保content架构中的字段设置为Buffer,然后您只需连接文件块缓冲区以保持二进制数据完整。例子:

var bufs = [];
doc.size = 0;
file.on('data',function(data) {
  bufs[bufs.length] = data;
  doc.size += data.length;
}).on('end', function() {
  doc.content = Buffer.concat(bufs, doc.size);
});
于 2014-12-13T14:19:46.690 回答