2017-01-26 17 views
0

Я пытаюсь сохранить удаленный файл изображения в базу данных, но у меня возникают некоторые проблемы с ним, так как я никогда не делал этого раньше.Сохранить файл изображения в базе данных с узлом/request/sequelize/mysql

Мне нужно загрузить изображение и передать его (с помощью узла) с несколькими другими свойствами другому узлу api, который сохранит его в базе данных mysql (используя сиквел). Мне удалось получить некоторые данные для сохранения, но когда я загружаю его вручную и пытаюсь открыть его, он не очень полезен, и изображение не появляется.

Я пробовал несколько вещей: получить изображение с помощью node-request, преобразовать его в строку base64 (прочитать об этом где-нибудь) и передать его в полезной нагрузке json, но это не сработало. Пробовал отправлять его как многочастный, но это тоже не сработало. Не работали с потоками/буферами/multipart все, что было раньше и никогда не было в узле. Я пробовал смотреть на узлы-запросы, но я не мог понять, как можно применить их к этому контексту.

Вот что я в настоящее время (это класс части ES6 так что нет «функции» ключевых слов, а также, запрос promisified):

function getImageData(imageUrl) { 
    return request({ 
     url: imageUrl, 
     encoding: null, 
     json: false 
    }); 
} 

function createEntry(entry) { 
    return getImageData(entry.image) 
     .then((imageData) => { 
      entry.image_src = imageData.toString('base64'); 
      var requestObject = { 
       url: 'http://localhost:3000/api/entry', 
       method: 'post', 
       json: false, 
       formData: entry 
      }; 
      return request(requestObject); 
     }); 
} 

Я почти 100% уверен, что проблема в этой части потому что api просто берет то, что получает, и дает ему сиквелизировать, чтобы положить в таблицу, но я мог ошибаться. Поле изображения задано как longblob.

Я уверен, что это просто, как только я выясню это, но до сих пор я в тупике.

ответ

2

Это не прямой ответ на ваш вопрос, но редко нужно фактически хранить изображение в базе данных. Обычно выполняется сохранение изображения на хранилище, например, S3, CDN, например CloudFront или даже в файловой системе статического файлового сервера, а затем сохранение только имени файла или некоторого идентификатора изображения в фактической базе данных.

Если есть вероятность, что вы собираетесь обслуживать эти изображения для некоторых клиентов, то обслуживание их из базы данных вместо CDN или файловой системы будет очень неэффективным. Если вы не собираетесь обслуживать эти изображения, то по-прежнему очень мало причин фактически помещать их в базу данных. Не похоже, что вы будете запрашивать базу данных для конкретного содержимого изображения или сортировать результаты по конкретной сериализации используемого формата изображения.

Простейшая вещь, которую вы можете сделать, это сохранить изображения с уникальным именем файла (либо случайной строкой, UUID, либо ключом из вашей базы данных), и сохранить идентификатор или имя файла в базе данных с другими данными, которые вам нужны. Если вам нужно эффективно обслуживать его, рассмотрите возможность использования S3 или некоторого CDN для этого.