PouchDB 返回错误的图像附件类型
PouchDB returning wrong image attachment type
我正在尝试将 PouchDB 添加到 return 一个小图像附件。当我通过 Fauxton 上传图像时,我的应用程序成功地 returns 一个带有 type: 'image/svg+xml'
的 Blob,它在我的 <img>
元素中正确呈现(使用 URL.createObjectURL
)。
但是,如果我让用户上传图像,然后将文件 Blob 放入我的远程 Pouch 数据库,我就会遇到问题。在这种情况下,PouchDB.getAttachment()
现在 return 是一个带有 type: 'application/octet-stream'
而不是 'image/svg+xml'
的 Blob,尽管它已使用正确的 content_type
上传。此图像不呈现,给我一个通用的浏览器 img 占位符。
为什么会发生这种情况?
第 1 步这是我从用户那里检索图像的方法:
var image = new Blob([fs.readFileSync(fileLocation, 'utf-8')], {
type: 'image/svg+xml'
})
第 2 步这是我将文档(和附件)放入 PouchDB 的方法:
var doc = await PouchDB.get(docID, {attachments: true})
doc._attachments = {
'logo.svg': {
content_type: 'image/svg+xml',
data: image
}
}
await PouchDB.put(doc)
您在读取文件时遇到了 2 个问题。首先是您不能将二进制数据视为 UTF8(SVG 文件可能不是真正的问题,但对于其他图像肯定是),第二个是您必须对其进行 base64 编码。
对 blob 进行 base64 编码有许多不同的方法,但最简单的解决方案是将其放置方法从 put
更改为 putAttachment
。像这样:
HTML:
...
<input type="file" id="inputFile">
...
JS:
...
var inputFile = document.querySelector('#inputFile');
var file = inputFile.files[0];
db.putAttachment('mydoc', 'myfile', file, file.type).then(...)
...
我正在尝试将 PouchDB 添加到 return 一个小图像附件。当我通过 Fauxton 上传图像时,我的应用程序成功地 returns 一个带有 type: 'image/svg+xml'
的 Blob,它在我的 <img>
元素中正确呈现(使用 URL.createObjectURL
)。
但是,如果我让用户上传图像,然后将文件 Blob 放入我的远程 Pouch 数据库,我就会遇到问题。在这种情况下,PouchDB.getAttachment()
现在 return 是一个带有 type: 'application/octet-stream'
而不是 'image/svg+xml'
的 Blob,尽管它已使用正确的 content_type
上传。此图像不呈现,给我一个通用的浏览器 img 占位符。
为什么会发生这种情况?
第 1 步这是我从用户那里检索图像的方法:
var image = new Blob([fs.readFileSync(fileLocation, 'utf-8')], {
type: 'image/svg+xml'
})
第 2 步这是我将文档(和附件)放入 PouchDB 的方法:
var doc = await PouchDB.get(docID, {attachments: true})
doc._attachments = {
'logo.svg': {
content_type: 'image/svg+xml',
data: image
}
}
await PouchDB.put(doc)
您在读取文件时遇到了 2 个问题。首先是您不能将二进制数据视为 UTF8(SVG 文件可能不是真正的问题,但对于其他图像肯定是),第二个是您必须对其进行 base64 编码。
对 blob 进行 base64 编码有许多不同的方法,但最简单的解决方案是将其放置方法从 put
更改为 putAttachment
。像这样:
HTML:
...
<input type="file" id="inputFile">
...
JS:
...
var inputFile = document.querySelector('#inputFile');
var file = inputFile.files[0];
db.putAttachment('mydoc', 'myfile', file, file.type).then(...)
...