繁体   English   中英

通过node.js RestAPI将图像从ios swift发布到Postgres数据库

[英]posting image from ios swift to a postgres database through node.js RestAPI

我正在尝试通过RestAPI(使用npm和pg-promise)将我的ios应用程序(swift)连接到Postgres数据库

发布字符串和整数值的工作原理很吸引人,但是我在将图像发布到数据库时遇到了麻烦

我正在将图片解码为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格式,因此格式不是问题

您对数据进行编码和/或将数据传递到服务中的方式一定有问题。


我为您拍了一张有问题的照片,这是一幅漂亮的照片,将其保存在本地,然后按照此处介绍的直接方法将其插入数据库。

图片插入没有任何问题。

这是完整的应用程序:

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
);

读回数据并将其保存会得到相同的有效图像。


您需要调查在前往服务的途中图像数据在哪里损坏;)您的某些图像序列化似乎破坏了数据。

而且由于问题对于大图像来说很明显,所以我建议将校验和附加到图像数据上,这样更容易找出数据在哪一步损坏了;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM