not sure I understand the question correctly but if the file itself is 
corrupt try using try something 
like https://github.com/rubenv/node-xlsx-writer to build the xlsx from 
jason, I use express framework (or koa) so I download with something simple 
like (sorry for coffeescript)

...get "/blabladownload", (req,res) ->

 ....

   fs.exists 'blabla.txt', (exists) ->
      if exists
        res.download __dirname + '/blabla.txt', (err) ->   # doesn't care 
about file type
          throw err if err
          if err
            console.log 'error download eShopDownLoad ',err.stack
            res.send 'Error download eShopDownLoad: '+ err.code

          else  
            fs.unlink __dirname + '/blabla.txt',(err,data) ->
              if err
                console.log 'error unlink eShopDownLoad ',err.stack
                res.send 'Error download eShopDownLoad: '+ err.code
              else
                 do more stuff

seems to work. Hope it helps. K

El jueves, 14 de agosto de 2014 15:57:57 UTC+2, Robert Crooks escribió:
>
> I have a proxy for several APIs (it handles OAuth authentication for the 
> call) built with simple node.js and request. It just returns all the 
> headers and response body from the API call to the client. One of the apis 
> has an option to return xlsx data instead of JSON. When I return that 
> response to the client, an xlsx file does get downloaded, but it's 
> corrupted somehow, and can't be opened by Excel (or any other spreadsheet 
> app). I think it's some kind of encoding mismatch, but can't figure out how 
> to fix it. Any help appreciated. (I am a node.js newbie by the way.) Here's 
> the proxy code, and I think it's in sendRequest() function that something's 
> going wrong:
>
>     var BCLSPROXY = (function () {
>         "use strict";
>         var util = require("util"),
>             colors = require("colors"),
>             http = require("http"),
>             request = require("request"),
>             aapiToken,
>             pmapiToken,
>             aapiExpires = 0,
>             pmapiExpires = 0,
>             aapiServer,
>             pmapiServer,
>             apiServer, // for other APIs
>             // functions
>             getFormValues,
>             getAAPIAccessToken,
>             getPMAPIAccessToken,
>             getAccessToken,
>             sendRequest;
>         /*
>          * extract form values from request body
>          */
>         getFormValues = function (body, callback) {
>             // split the request body string into an array
>             var valuesArray = body.split("&"),
>                 options = {},
>                 max = valuesArray.length,
>                 i,
>                 item,
>                 error = null;
>             // initialize options to null except requestType to GET
>             options.url = null;
>             options.client_id = null;
>             options.client_secret = null;
>             options.requestBody = null;
>             options.requestType = "GET";
>             // now split each item into key and value and store in the 
> object
>             for (i = 0; i < max; i = i + 1) {
>                 item = valuesArray[i].split("=");
>                 options[item[0]] = item[1];
>             }
>             // data fixes
>             // decode the URL
>             options.url = decodeURIComponent(options.url);
>             // check for required values
>             if (options.client_id === null || options.client_secret === 
> null || options.url === null) {
>                 error = "Error: client_id, client_secret, and url for API 
> request are required!";
>             }
>             if (error === null) {
>                 callback(null, options);
>             } else {
>                 callback(error);
>             }
>         };
>         /*
>          * get new Analytics API access_token
>          */
>         getAAPIAccessToken = function (options, callback) {
>             // base64 encode the ciient_id:client_secret string for basic 
> auth
>             var auth_string = new Buffer(options.client_id + ":" + 
> options.client_secret).toString("base64"),
>                 bodyObj,
>                 now = new Date().valueOf();
>             if (aapiExpires < now) {
>                 request({
>                     method: 'POST',
>                     url: 'https://oauth.brightcove.com/v3/access_token',
>                     headers: {
>                         "Authorization": "Basic " + auth_string,
>                         "Content-Type": "application/x-www-form-urlencoded"
>                     },
>                     body: 'grant_type=client_credentials'
>                 }, function (error, response, body) {
>                     // check for errors
>                     if (error === null) {
>                         // return the access token to the callback
>                         bodyObj = JSON.parse(body);
>                         aapiToken = bodyObj.access_token;
>                         aapiExpires = now + (bodyObj.expires_in * 1000);
>                         callback(null, aapiToken);
>                     } else {
>                         callback(error);
>                     }
>                 });
>             } else {
>                 callback(null, aapiToken);
>             }
>         };
>         /*
>          * get new Player Management API access_token
>          */
>         getPMAPIAccessToken = function (options, callback) {
>             // base64 encode the ciient_id:client_secret string for basic 
> auth
>             var auth_string = new Buffer(options.client_id + ":" + 
> options.client_secret).toString("base64"),
>                 bodyObj,
>                 now = new Date().valueOf();
>             if (pmapiExpires < now) {
>                 request({
>                     method: 'POST',
>                     url: 'https://oauth.brightcove.com/v3/access_token',
>                     headers: {
>                         "Authorization": "Basic " + auth_string,
>                         "Content-Type": "application/x-www-form-urlencoded"
>                     },
>                     body: 'grant_type=client_credentials'
>                 }, function (error, response, body) {
>                     // check for errors
>                     if (error === null) {
>                         // return the access token to the callback
>                         bodyObj = JSON.parse(body);
>                         pmapiToken = bodyObj.access_token;
>                         pmapiExpires = now + (bodyObj.expires_in * 1000);
>                         callback(null, pmapiToken);
>                     } else {
>                         callback(error);
>                     }
>                 });
>             } else {
>                 callback(null, pmapiToken);
>             }
>         };
>         /*
>          * get new access_token for other APIs
>          */
>         getAccessToken = function (options, callback) {
>             // base64 encode the ciient_id:client_secret string for basic 
> auth
>             var auth_string = new Buffer(options.client_id + ":" + 
> options.client_secret).toString("base64"),
>                 bodyObj;
>             // don't know what API was requested, always get new token
>             request({
>                 method: 'POST',
>                 url: 'https://oauth.brightcove.com/v3/access_token',
>                 headers: {
>                     "Authorization": "Basic " + auth_string,
>                     "Content-Type": "application/x-www-form-urlencoded"
>                 },
>                 body: 'grant_type=client_credentials'
>             }, function (error, response, body) {
>                 // check for errors
>                 if (error === null) {
>                     // return the access token to the callback
>                     bodyObj = JSON.parse(body);
>                     callback(null, bodyObj.access_token);
>                 } else {
>                     callback(error);
>                 }
>             });
>         };
>         /*
>          * sends the request to the targeted API
>          */
>         sendRequest = function (token, options, callback) {
>             var requestOptions = {
>                     method: options.requestType,
>                     url: options.url,
>                     headers: {
>                         "Authorization": "Bearer " + token,
>                         "Content-Type": "application/json"
>                     },
>                     body: options.requestBody
>                 };
>             request(requestOptions, function (error, response, body) {
>                 console.log("error", error);
>                 if (error === null) {
>                     callback(null, response.headers, body);
>                 } else {
>                     callback(error);
>                 }
>             });
>         };
>     /*
>      * sends the request to the Analytics API (special case)
>      */
>     sendRequest = function (token, options, callback) {
>         var requestOptions = {
>                 method: options.requestType,
>                 url: options.url,
>                 headers: {
>                     "Authorization": "Bearer " + token,
>                     "Content-Type": "application/json"
>                 },
>                 body: options.requestBody
>             };
>         request(requestOptions, function (error, response, body) {
>             console.log("error", error);
>             if (error === null) {
>                 callback(null, response.headers, body);
>             } else {
>                 callback(error);
>             }
>         });
>     };
>         /*
>          * Http Server to handle Analytics API requests
>          */
>         aapiServer = http.createServer(function (req, res) {
>             var body = "";
>             /* the published version of this proxy accepts requests only 
> from
>              * domains that include "brightcove.com"
>              * modify the following line to take requests from
>              * other domains or remove the if block to
>              * accept requests from any domain (not recommended!)
>              */
>             if (req.headers.origin.indexOf("brightcove.com") < 0) {
>                 res.writeHead(500);
>                 res.end("Your request cannot be processed; this proxy only 
> handles requests originating from Brightcove servers. If you would like to 
> build your own version of this proxy, see 
> http://docs.brightcove.com/en/perform/oauth-api/guides/quick-start.html";);
>             }
>             req.on("data", function (chunk) {
>                 body += chunk;
>             });
>             req.on("end", function () {
>                 getFormValues(body, function (error, options) {
>                     if (error === null) {
>                         getAAPIAccessToken(options, function (error, 
> token) {
>                             if (error === null) {
>                                 sendRequest(token, options, function 
> (error, headers, body) {
>                                     if (error === null) {
>                                         console.log("headers", headers);
>                                         var header;
>                                         for (header in headers) {
>                                             res.setHeader(header, 
> headers[header]);
>                                         }
>                                         if (body.indexOf("{") === 0 || 
> options.url.indexOf("format=json") > -1) {
>                                             // prettify JSON
>                                             body = 
> JSON.stringify(JSON.parse(body), true, 2);
>                                         }
>                                             res.writeHead(200);
>                                             res.end(body);
>                                     } else {
>                                         res.writeHead(500);
>                                         res.end("Your API call was 
> unsuccessful; here is what the server returned: " + error);
>                                     }
>                                 });
>                             } else {
>                                 res.writeHead(500);
>                                 res.end("There was a problem getting your 
> access token: " + error);
>                             }
>                         });
>                     } else {
>                         res.writeHead(500);
>                         res.end("There was a problem with your request: " 
> + error);
>                     }
>                 });
>             });
>         // change the following line to have the proxy listen for requests 
> on a different port
>         }).listen(8002);
>         /*
>          * Http Server to handle Player Management API requests
>          */
>         pmapiServer = http.createServer(function (req, res) {
>             var body = "";
>             // the published version of this proxy accepts requests only 
> from domains that include "brightcove.com"
>             // modify the following line to take requests from other 
> domains
>             // or remove the if block to accept requests from any domain 
> (not recommended!)
>             if (req.headers.origin.indexOf("brightcove.com") < 0) {
>                 res.writeHead(500);
>                 res.end("Your request cannot be processed; this proxy only 
> handles requests originating from Brightcove servers. If you would like to 
> build your own version of this proxy, see 
> http://docs.brightcove.com/en/perform/oauth-api/guides/quick-start.html";);
>             }
>             req.on("data", function (chunk) {
>                 body += chunk;
>             });
>             req.on("end", function () {
>                 getFormValues(body, function (error, options) {
>                     if (error === null) {
>                         getPMAPIAccessToken(options, function (error, 
> token) {
>                             if (error === null) {
>                                 sendRequest(token, options, function 
> (error, headers, body) {
>                                     if (error === null) {
>                                         console.log("headers", headers);
>                                         var header;
>                                         for (header in headers) {
>                                             res.setHeader(header, 
> headers[header]);
>                                         }
>                                         if (body.indexOf("{") === 0 || 
> options.url.indexOf("format=json") > -1) {
>                                             // prettify JSON
>                                             body = 
> JSON.stringify(JSON.parse(body), true, 2);
>                   &
> ...

-- 
Job board: http://jobs.nodejs.org/
New group rules: 
https://gist.github.com/othiym23/9886289#file-moderation-policy-md
Old group rules: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/nodejs/8ffcef9a-a1a4-46a7-ae59-e7d7992135cc%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to