отправка изображения из ios swift в базу данных postgres через node.js RestAPI

ios node.js swift postgresql pg-promise

339 просмотра

1 ответ

Я пытаюсь подключить мое приложение ios (swift) к базе данных postgres через RestAPI (используя npm и pg-обещание)

Публикация строковых и целочисленных значений работала как талисман, но у меня возникают проблемы при отправке изображений в базу данных.

Я декодирую изображение в строку base64, чтобы я мог отправить его в запрос POST, а затем отправил строку в мою таблицу или расшифровал ее до bytea перед публикацией ... оба метода работали с некоторыми изображениями и не работали с другими изображениями, давая мне "не правильный формат" ошибка ...

Вот мой код

ios Swift

private static func request(todo: JSON -> ()) {

    let imageb = UIImageJPEGRepresentation(image, 0.7)
    let str64 = Helper.nsdataToStr64(imageb)

    Alamofire.request(.POST, 
                      "http://127.0.0.1:3000/api/photos", 
                      parameters: ["visit_id": 1, "photo" : str64])
        .responseJSON { (response) in
            switch response.result {
            case .Success:
                let results: JSON = JSON(data: response.data!)["data"]
                todo(results)
            case .Failure(let error):
                print("Failed: \(error)")
            }

    }
}

queries.js

function uploadPhoto(req, res, next) {
    req.body.visit_id = parseInt(req.body.visit_id);

    //db.one('insert into photos(visit_id, photo) values(${visit_id}, decode(${photo}, \'base64\')) returning _id',
    //  req.body)
    db.one('insert into photos(visit_id, base64) values(${visit_id}, ${photo}) returning _id',
      req.body)
    .then(function (data) {
      res.status(200)
      .json({ 
        status: 'success',
        data: data,
        message: 'Inserted one photo' 
      });
    }) 
    .catch(function (err) {
      return next(err);
      //console.log("ERROR:", err.message || err);
    });
}

Теперь этот метод работает безупречно с этой картиной и многими другими, но не работает с этой картиной и многими другими. Есть идеи почему? Я заметил, что если размер изображения превышает несколько сотен килобайт, метод post завершается ошибкой ... Возможно ли это? и почему? Есть ли способ решить эту проблему?

Примечание: все картинки в формате jpg, поэтому формат не проблема

Автор: Anya Alstreim Источник Размещён: 08.11.2019 11:23

Ответы (1)


0 плюса

Что-то должно быть не так в том, как вы кодируете и / или передаете данные в службу.


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

Картинка вставлена ​​без проблем.

Вот полное приложение:

var fs = require('fs');

let pgp = require('pg-promise')();

let db = pgp("postgres://postgres@localhost:5433/newone");

fs.readFile('c:/temp/Bella.jpg', function (err, imgData) {
    db.one('insert into images(img) values($1) returning id', imgData, i=>i.id)
        .then(id=> {
            console.info(id);
        })
        .catch(err=> {
            console.error(err);
        });
});

Выходы новой записи Id: 1

Таблица, которую я использовал:

create table images (
    id serial primary key,
    img bytea not null
);

Чтение данных и их сохранение приводят к той же действительной картине.


Вам нужно выяснить, где данные изображения повреждаются во время пути к службе;) Вероятно, что некоторые из ваших сериализаций изображения разрушают данные.

И поскольку проблема проявляется для большого изображения, я бы предложил прикрепить контрольную сумму к данным изображения, чтобы было легче определить, на каком этапе данные будут повреждены;)

Автор: vitaly-t Размещён: 20.08.2016 03:33
Вопросы из категории :
32x32