繁体   English   中英

在Backand中,如何从node.js动作上传文件?

[英]In Backand how do I upload a file from node.js action?

我在使用上传功能时遇到问题。 这是我的情况。 我有:一个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操作的代码(仅与此问题相关的代码):

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;
    });
}

问题解决了,谢谢。 它是由默认情况下在Buffer中使用的“ utf8”编码引起的。 将其指定为new Buffer(reportData, 'binary')已解决了该问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM