2017-07-15 21 views
1

出於某種原因,我需要將一些文件(主要是圖像或pdf)存儲到我的數據庫(PG 9.2.20)中。 這些文件是由用戶上傳的,當我將它們下載回來時,它們已損壞。Nodejs,將bin文件作爲BYTEA存儲到pgsql中(損壞的文件)

  • 我正在使用nodejs。
  • 我存儲該文件的列類型是BYTEA。

這是我如何存儲他們:

const { files, fields } = await asyncBusboy(ctx.req); 
const fileName = files[0].filename; 
const mimeType = files[0].mimeType; 
const bufferedFile = fs.readFileSync(files[0].path, { encoding: 'hex' }); 
const fileData = `\\x${bufferedFile}`; 

//Just a basic insert into with knex.raw 
const fileId = await storageModel.create(fields.name, fields.description, fileName, mimeType, fileData, ctx.user); 

這就是我如何找回我的文件:

const file = await storageModel.find(ctx.params.fileId, ctx.user); 
ctx.body = Buffer.from(file.file_bin, 'hex'); 
ctx.set('Content-disposition', `attachment; filename=${file.file_name}`); 

文件被破壞,當然,如果我仔細一看,上傳的文件和我下載的文件是不同的。 見六角截圖,有在下載一個開始一些額外的數據:http://imgur.com/a/kTRAB

後一些更多的測試,我可以告訴大家,問題在於到KOA的一部分,當我把緩衝到ctx.body。它被損壞了(???)

編輯:我與揚鞭UI工作:https://github.com/swagger-api/swagger-ui/issues/1605

+0

我正在用Swagger客戶端測試我的路線。當我通過在我的瀏覽器中調用url進行測試它的工作原理... – thesearentthedroids

回答

1

你不應該使用bytea作爲一個普通的文本字符串。您應該直接輸入Buffer,並讓驅動程序正確地爲您轉義。

不知道你所使用的驅動程序,但如...

+0

我認爲knexjs可以逃避緩衝區,因爲它應該是。我不確定,所以我繼續搜索,只用TEXT替換我的BYTEA列。所以現在我在我的緩衝區中使用.toString方法來存儲它,然後當我使用Buffer.from(都在base 64中)檢索數據來重新創建緩衝區時,我將它返回。我的文件仍然損壞(總是與我的屏幕截圖相同的偏移量) – thesearentthedroids

+0

@thesearentthedroids這是一個非常糟糕的做法。您應該查詢如何在knex中插入二進制數據,並將類型保留爲'bytea'。我不能提供更多細節,因爲我對自己不熟悉knex。 –