2015-07-17 4 views
1

Я запрашивая к API с помощью Restify Моей базы данных SQLite есть таблица мест, которая имеет следующую структуру (id INTEGER, name TEXT, image BLOB) Я пытаюсь вывести результат ответа, как изображение (блобо содержит jpeg-изображение), но до сих пор мне не удалось. В браузере после запроса я получаю The image 'http://localhost:8080/place/1 cannot be displayed because it contains errors Я получаю должным образом в консоли название места.узел возврат изображений хранятся в SQLite сгустка

Вот мой код:

var restify = require('restify'); 

function respond(req, res, next) { 
    var fs = require("fs"); 
    var file = "./data.db"; 
    var exists = fs.existsSync(file); 

    var sqlite3 = require('sqlite3').verbose(); 
    var db = new sqlite3.Database(file); 

    db.get("SELECT id, name, image FROM places WHERE id = ?", req.params.uid, function(err, row){ 
    console.log(row.name); 
    res.header('Content-Type', 'image/jpeg'); 
    res.end(row.image); 
    db.close(); 
    }); 

    next(); 
} 

var server = restify.createServer(); 

server.get('/place/:uid', respond); 
server.listen(8080, function() { 
    console.log('%s listening at %s', server.name, server.url); 
}); 

UPDATE: Изображение возвращается без проблем, когда я создать блоб, используя ту же самую node-sqlite3 библиотеку. Если я создаю капли, используя Ruby или Go (те, которые я тестировал), декодирование node-sqlite3 не работает должным образом.

Что здесь происходит? Любая помощь оценивается.

+0

Вы закрываете базу данных 'db.close' перед запуском запроса, так как запрос выполняется асинхронно. Переместите 'db.close' в конец обратного вызова' db.get'. –

+0

@ColonelThirtyTwo Done, по-прежнему та же проблема, я обновляю код с вашим предложением. –

ответ

0

Используйте в поле VARCHAR и сохраните на картинке как строку, затем извлеките в качестве массива байтов. Ниже приведен код, в котором вы можете хранить изображения и извлекать их. без использования blob. это простой способ для вас.

Uri selectedImage = data.getData(); 
     ImageView imageView=(ImageView)this.findViewById(R.id.imageView1); 

     getContentResolver().notifyChange(selectedImage, null); 

     ContentResolver cr = getContentResolver(); 
     Bitmap bitmap; 
     try { 


      bitmap = android.provider.MediaStore.Images.Media 
      .getBitmap(cr, selectedImage); 
      imageView.setImageBitmap(bitmap); 

      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
      byte[] b = baos.toByteArray(); 
      String encodedImageString = Base64.encodeToString(b, Base64.DEFAULT); 

      byte[] bytarray = Base64.decode(encodedImageString, Base64.DEFAULT); 
      Bitmap bmimage = BitmapFactory.decodeByteArray(bytarray, 0, 
        bytarray.length); 

      myDb.execSQL("INSERT INTO imgtbl VALUES('"+encodedImageString+"');"); 
      Cursor c= myDb.rawQuery("SELECT * FROM imgtbl", null); 

      c.moveToFirst(); 
      String img=c.getString(0); 
      byte[] byarray = Base64.decode(img, Base64.DEFAULT); 
      Bitmap bmimg = BitmapFactory.decodeByteArray(byarray, 0, 
        byarray.length); 

      ImageView iv=(ImageView)findViewById(R.id.img2); 
      ImageView iv1=(ImageView)findViewById(R.id.img3); 

      iv.setImageBitmap(bmimg); 
      iv1.setImageBitmap(bmimg); 


     } catch (Exception e) { 
      Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT) 
        .show(); 

      e.printStackTrace(); 
     } 
Смежные вопросы