[英]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.