Как загрузить изображения с помощью Dropbox API v2 в серверной части nodejs - PullRequest
0 голосов
/ 08 июля 2019

Я пытался загрузить изображения в папку приложения dropbox с помощью API dropbox v2 в моей серверной части nodejs, но каждое успешно загруженное изображение повреждено и имеет размер всего 15 байт и не может быть предварительно просмотрено из папки приложения dropbox.

Это мой код;

const express = require("express");
const router = express.Router();
const fetch = require("isomorphic-fetch");
const Dropbox = require("dropbox").Dropbox;

const dbx = new Dropbox({
  accessToken:
    "my access token",
  fetch: fetch
});


router.post("/dbx", (req, res) => {

  let imageArray;

//I receive either a single image or an array of images from the front end and
//its placed in req.files by express-fileupload

  if (req.files.itemImage.length) {
    imageArray = [...req.files.itemImage];
  } else {
    imageArray = [req.files.itemImage];
  }

  imageArray.forEach(image => {
  console.log("Image==>>",image)

 dbx
      .filesUpload({
        path: `/${image.name}`,
        contents: image
      })
      .then(response => {
        console.log(response);
      })
      .catch(err => {
        console.log(err);
      });
});
});

Ниже показано, как выглядит типичное изображение, которое я посылаю из команды console.log("Image==>>",image) в моем терминале

{ name: 'ImageName.jpg',
  data:
  <Buffer ff d8 ff e1 1f 39 45 78 69 66 00 00 4d 4d 00 2a 00 00 00 08 00 07 01 12 00 03 00 00 00 01 00 01 00 00 01 1a 00 05 00 00 00 01 00 00 00 62 01 1b 00 05 ... >,
  size: 1865542,
  encoding: '7bit',
  tempFilePath: '',
  truncated: false,
  mimetype: 'image/jpeg',
  md5: '133bda2ce6d52b4bada8ba31349c4910',
  mv: [Function: mv] }

Ниже приведен ответ, который я получаю из Dropbox в моем терминале

{ name: 'ImageName.jpg',
  path_lower: '/imageName.jpg',
  path_display: 'ImageName.jpg',
  id: 'id:R0fPv_de0wAAAAAAAAAAJw',
  client_modified: '2019-07-08T10:21:36Z',
  server_modified: '2019-07-08T10:21:36Z',
  rev: '0130000000015cb7a8c0',
  size: 15,
  is_downloadable: true,
  content_hash:
   '87bfbb905f228845cfb691920551882f446042da2ef9576e26ca97c5374c3eef' }

Имя изображения корректно отображается в поле name:, но размер изображения составляет всего 15 байт, и его нельзя просмотреть в Dropbox.папка приложения.Я не понимаю, что происходит, поэтому я понятия не имею, как это исправить.Может ли кто-нибудь помочь мне объяснить, что я делаю не так?Если что-то в моем вопросе не ясно, пожалуйста, укажите это, и я отредактирую соответственно.

Я попытался отправить содержимое запроса как JSON.stringify(image) и получил поврежденный файл в 3 раза больше, чем яПри отправке я нашел способ, в котором мне нужно было сначала загрузить изображения в папку на моем сервере, а затем использовать команды fs для записи содержимого каждого в запрос, но я не хочу, чтобы такая папка быласервер, я бы предпочел просто отправить изображения немедленно, если это возможно.

Я ожидаю получить положительное сообщение от сервера Dropbox с правильным размером изображения, а затем иметь возможность предварительного просмотра изображения в папке приложения Dropbox Iсоздано.

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Публикация этого в качестве FYI для будущих поисковиков, потому что мне тоже было трудно это понять.Комментарии приветствуются, если это объяснение может быть улучшено.
Конечная точка Dropbox / files / upload ожидает двоичные данные файла (среди прочего).В серверном мире JavaScript класс Buffer - это то, как Node работает с двоичными данными.Хотя иногда вы можете обнаружить двоичные данные файла (объект Buffer) в запросе или ответе, класс Buffer также имеет множество методов для создания собственного объекта Buffer из файла, когда вам это необходимо.
Я нашел эту статью о буферах из FreeCodeCamp как полезный ресурс.

0 голосов
/ 08 июля 2019

Я понял это сам.Только публикация на тот случай, если кто-то столкнется с той же проблемой.Содержимое должно быть изменено с изображения на image.data

, т.е. вместо того, чтобы делать это;

dbx
      .filesUpload({
        path: `/${image.name}`,
        contents: image
      })
      .then(response => {
        console.log(response);
      })
      .catch(err => {
        console.log(err);
      });

, оно должно быть таким

dbx
      .filesUpload({
        path: `/${image.name}`,
        contents: image.data
      })
      .then(response => {
        console.log(response);
      })
      .catch(err => {
        console.log(err);
      });
...