在 Backand 如何从 node.js 操作上传文件?

Posted

技术标签:

【中文标题】在 Backand 如何从 node.js 操作上传文件?【英文标题】:In Backand how do I upload a file from node.js action? 【发布时间】:2016-06-03 18:33:48 【问题描述】:

我在使用上传功能时遇到问题。这是我的情况。我有:一个 SQL 查询,一个使用该查询生成 .xlsx 报告的 node.js 操作,以及一个用于存储生成的报告的上传操作。我的问题是,如果我从 node.js 代码(使用 BackandSdk)调用上传操作,则文件内容是以八位字节而不是实际的二进制数据编写的。但是当我使用完全相同的 JSON 正文从浏览器调用它时,一切正常。 以下是下载文件的摘录:

504b 0304 0a00 0000 0000 0000 2100 3b48
8e40 c404 0000 c404 0000 1300 0000 5b43
6f6e 7465 6e74 5f54 7970 6573 5d2e 786d
6c3c 3f78 6d6c 2076 6572 7369 6f6e 3...

关于我做错了什么有什么想法吗?

更新: node.js action的代码(仅与本题相关的代码):

var BackandSdk = require('./backand');
var backand = new BackandSdk();

var masterToken = "<master token>"; //<put here the master token that you run in the action init>;
var userToken = "<user token>"; //<put here the user token that you run in the action init>;
var token = masterToken + ":" + userToken;

exports.generateMonthlyReport = generateMonthlyReport;

function generateMonthlyReport(month, userId)     
    return backand.basicAuth(token)
        .then(function () 
            return backand.get('/1/query/data/monthlyReport', 
                month: month
            );
        )
        .then(function (result) 
            // build xlsx report using xlsx-template
            // returns promise that resolves with binary data
            return generateXls('monthly-timelog.xlsx', 
                data: result,
                total: sumTotal(result)
            );
        )
        .then(function (reportData) 
            var name = 'timelog-' + month.toLowerCase() + '.xlsx';
            return deleteReport(name).then(function () 
                return uploadReport(name, reportData);
            );
        )
        .catch(function (err) 
            console.log(err.stack);
            return q.reject(err);
        );

    function sumTotal(rows) 
        return rows.reduce(function (total, row) 
            return total + row.total;
        , 0);
    

执行实际上传的uploadReport函数:

function uploadReport(reportName, reportData) 
    var base64 = new Buffer(reportData).toString('base64');
    return backand.api.post('/1/objects/action/timeEntries?name=uploadReport', 
        filename: reportName,
        filedata: base64
    ).then(function (res) 
        console.log(res);
        return res;
    );

【问题讨论】:

【参考方案1】:

问题已解决,谢谢。它是由 Buffer 默认使用的 'utf8' 编码引起的。将其指定为new Buffer(reportData, 'binary') 即可解决问题。

【讨论】:

以上是关于在 Backand 如何从 node.js 操作上传文件?的主要内容,如果未能解决你的问题,请参考以下文章

backand 平台:如何在“backand”服务中调试“安全操作”

如何使用 Backand 安全操作参数

如何确保按需操作的 backand (back&)

如何从 Backand 上的表中删除多行?

如何使用 Backand 创建向管理员发送电子邮件的安全操作?

Backand/Ionic - 如何检索登录用户的数据?