Получение сообщения «Нет файла» или пустого файла при попытке загрузить файл PDF с Node.js - PullRequest
1 голос
/ 29 мая 2020

Проблема:

Мне нужно скачать PDF-файл с моего сервера, но я получаю сообщение «Нет файла» или пустой файл

Подробности:

Вот мой код на стороне сервера:

let fileBuffered = '';

// authentication for downloading a file from Dropbox API to my server
    const dropbox = dropboxV2Api.authenticate({
        token: process.env.DEV_DROPBOX_SECRET_KEY
    });

    // configuring parameters
    const params = Object.freeze({
        resource: "files/download",
        parameters: {
            path: `/${customerFileFolder}/${fileName}`
        }
    });

    let dropboxPromise = new Promise(function (resolve, reject) {
        dropbox(params, function (err, result) {
            if (err) {
                reject(err);
            } else {
                resolve(result);
            }
        }).on('data',function(data) {
                fileBuffered += data;
        })
    const file = fileBuffered;

    res.setHeader("Content-Type", "application/octet-stream");
    res.send(file);

Размер файла PDF, который я пытаюсь загрузить, составляет 139 694 байта. Длина переменной fileBuffered - 132 597. Вот содержимое переменной, показанное в отладчике: enter image description here Похоже на файл git PDF-файл

Вот клиентская сторона

function documentFileDownload(fileName) {
    const ip = location.host;
    let request = $.ajax({
        type: "POST",
        url: `${http() + ip}/documentFileDownload`,

        headers: {
            "Accept": "application/octet-stream"
        },


        data: {
            fileName: fileName
        },
        error: function (err) {
            console.log("ERROR: " + err);
        }
    });

    console.log(request);

    return request;
}

Проблема: Затем я получаю ответ на стороне клиента, он выглядит следующим образом:

enter image description here

Обратите внимание на размер текста ответа: 254Кб. На самом деле я получаю в браузере сообщение «Ошибка - нет файла»

enter image description here

Что еще я пробовал:

Я попытался поиграть с различными типами содержимого (application / pdf, text / pdf) на стороне сервера и попытался преобразовать переменную в буфер base64

const file = `data:application/pdf;base64, ${Buffer.from(fileBuffered).toString("base64")}`;

и добавил res.setHeader("Accept-Encoding", "base64"); но все равно получаю тот же результат.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Я нашел решение. Я пропустил событие .on("end", ) при чтении данных из потока Dropbox. Вот рабочее решение:

Вот на стороне сервера:

let chunk = [];
let fileBuffered = '';

// authentication for downloading a file from Dropbox API to my server
    const dropbox = dropboxV2Api.authenticate({
        token: process.env.DEV_DROPBOX_SECRET_KEY
    });

    // configuring parameters
    const params = Object.freeze({
        resource: "files/download",
        parameters: {
            path: `/${customerFileFolder}/${fileName}`
        }
    });

    let dropboxPromise = new Promise(function (resolve, reject) {
        dropbox(params, function (err, result) {
            if (err) {
                reject(err);
            } else {
                resolve(result);
            }
        }).on('data',function(data) {
                fileBuffered += data;
        }).on('end', () => {
                // console.log("finish");\
                // generate buffer
                fileBuffered = Buffer.concat(chunk);
            });

    const file = `data:application/pdf;base64, ${Buffer.from(fileBuffered).toString("base64")}`;
    res.setHeader("Content-Type", "application/pdf");
    res.send(file);

На стороне клиента:

function documentFileDownload(fileName) {
    const ip = location.host;
    let request = $.ajax({
        type: "POST",
        url: `${http() + ip}/documentFileDownload`,
        responseType: "arraybuffer",
        headers: {
            "Accept": "application/pdf"
        },

        data: {
            fileName: fileName
        },
        error: function (err) {
            console.log("ERROR: " + err);
        }
    });

    // console.log(request);
    return request;
}
0 голосов
/ 30 мая 2020

Попробуйте добавить dataType: "blob" в свой метод $. ajax

, а внутри объекта заголовков добавьте это 'Content-Type', 'application/json'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...