2016-06-03 8 views
0

Ich habe Probleme mit der Upload-Funktion. Hier ist mein Fall. Ich habe: eine SQL-Abfrage, eine Aktion node.js, die einen .xlsx-Bericht mit dieser Abfrage generiert, und eine Upload-Aktion zum Speichern des generierten Berichts. Mein Problem ist, dass der Dateiinhalt in Oktetts geschrieben wird und nicht in binäre Daten, wenn ich die Upload-Aktion aus dem node.js-Code (mit BackandSdk) aufruft. Aber wenn ich es vom Browser mit genau demselben JSON-Körper ausrufe, funktioniert alles gut. Hier ist ein Auszug aus der heruntergeladenen Datei:In Backand wie lade ich eine Datei aus der Aktion node.js hoch?

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... 

Alle Ideen, was ich falsch mache?

UPDATE: Der Code von node.js Aktion (nur der Code auf diese Frage bezogen):

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 Funktion, die den tatsächlichen Upload führt:

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

Antwort

0

Problem ist gelöst, danke. Es wurde durch die utf8-Codierung verursacht, die standardmäßig in Buffer verwendet wird. Die Angabe als new Buffer(reportData, 'binary') hat das Problem gelöst.