0

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形式なので形式は問いません

4

1 に答える 1

0

Something has got to be wrong in the way you that you encode and/or pass in the data into the service.


I took your problematic picture, which is a beautiful one btw, saved it locally and then inserted it into the database using the direct approach as explained here.

The picture inserted without any problems.

Here's complete application:

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

Outputs new record Id: 1

Table I used:

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

Reading the data back and saving it resulted in the same valid picture.


You need to investigate where the image data gets corrupted while on the way to the service ;) It seems likely that some of your image serialization breaks the data.

And since the problem manifests itself for a large image, I would suggest attaching a checksum to the image data, so it is easier to find out on which step the data becomes corrupted ;)

于 2016-08-20T15:33:12.903 に答える