Узел js: - ответные порции в файл с переименованием с помощью content-disposition - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь получить документ (pdf / docx / zip / ..) из API и сохранить его с именем файла, полученным при расположении содержимого в заголовке ответа.Я попробовал следующие методы.Но либо файл не сохраняется с фактическим именем файла, либо файл сохраняется с поврежденным (0 КБ) файлом.Я пробовал это в течение 2 дней.Может ли кто-нибудь указать, где это идет не так?

var calloptions = {
    method: 'GET',
    url: 'https://ip:port/address',
    qs: { docId: 'something toffetch' },
    headers:
        {
            'content-type': 'application/json',
            authorization: postData.bcAccessToken
        }
};
console.log("calloptions", calloptions);
var filepath = require('path').join(require('os').homedir(), 'Desktop');
var name = 123;
var myFile = [];
request(calloptions, function (error, response, body) {
    if (error) throw new Error(error);
    var chunks = [];
    name = 456;
    // var myFile ;
    //original=;
    console.log(response.headers["content-disposition"]);
    if (response.headers["content-disposition"]) {
        myFile.push(filepath + "\\" + response.headers["content-disposition"].split("=").pop());
        console.log(myFile);

        //        console.log(myFile);
        console.log("BEFORE WRITTING");
        response.on('data', function (chunk) {
            while (chunk = this.read()) {
                chunks.push(chunk);
                //chunk.pipe(fs.appendFile(filepath+"\\"+response.headers["content-disposition"].split("=").pop()));
            }

            // fs.appendFileSync(myFile, chunk);
            // fs.appendFile(myFile, chunk, function (err) {
            //     if(err) throw err;
            //     console.log("DURING WRITTING");
            //     console.log("myFile :- ",myFile);
            // });
            //chunks.pipe(fs.appendFile(filepath+"\\"+response.headers["content-disposition"].split("=").pop()));
            // console.log("writing completed to file");
        });//.pipe(fs.createWriteStream(filepath+"\\"+response.headers["content-disposition"].split("=").pop()));
        console.log("AFTER WRITTING");
    }
}).on('end', () => {
    console.log('There will be no more data.');
    console.log("IN THE END - ");
    console.log(name);
    console.log(myFile);
});//.pipe(fs.createWriteStream(filepath+"\\"+name));
console.log("AFTER REQUEST");                      

1 Ответ

0 голосов
/ 20 декабря 2018

Я решил это, используя async.waterfall, как показано ниже.Но лучший способ решить эту проблему всегда ценится.

async.waterfall([
     function (callback) {
         request(calloptions, function (error, response, body) {
             if (error) throw new Error(error);
             console.log(response.headers["content-disposition"]);
             if (response.headers["content-disposition"]) {

                 //var myFile2 = filepath + "\\" + response.headers["content-disposition"].split("=").pop();
                 var body = '';
                 response.on('data', function (chunk) {
                     body += chunk;
                 });
                 callback(null, response.headers["content-disposition"].split("=").pop());
             }
         }).pipe(fs.createWriteStream(filepath+"\\"+"Orig.pdf"));
     },
     function (res, callback) {
         console.log("SECOND FUNCTION");
         console.log(res);
         fs.rename(filepath+"\\"+"Orig.pdf", filepath+"\\"+res, function (err) {
             if (err) throw err;
             console.log('renamed complete');
           });
     }
 ])
...