node.js - 上传的文件在浏览器中显示base64数据

标签 node.js browser base64 couchdb attachment

我正在使用 couchdb 来存储需要在浏览器中显示的附件。

数据从 html 输入上传,然后在调用 saveDoc 时进行处理:

getFileData: function(file){
    var reader = new FileReader();
    return new Promise(function(accept, reject){
        reader.onload = (e) => {
            accept(e.target.result)
        };
        reader.readAsDataURL(file);
    })
},
saveDoc: function(name, type, filedata, url){
    console.log(filedata)
    var self=this
    return new Promise(function(accept, reject){
        self.getData(url).then(data => {
            var rev = data['_rev']
            console.log(url + ' is the url')
            console.log(name + ' is the filename')
            documentation.attachment.insert(url, name, filedata, type,
                                            { rev: rev }, function(err, body) {

                                                if (!err){
                                                    console.log(body);
                                                }
                                                else {
                                                    console.log(err)
                                                }
                                            })
        }).catch(err => {
            console.log(err)
        })
    })
},

从控制台上传时我没有收到任何错误。但是,当我导航到控制台中附件应位于的位置时,我看到一条浏览器消息,告诉我无法显示数据(对于 pdf/图像),或者我看到一个如下所示的 base64 字符串:

data:image/png;base64,iVBOR...

当附件是 html 文档时。

(saveDoc 上记录的数据如下所示: 数据:application/pdf;base64,JVBER...)

我的 couchdb 管理中显示了正确的内容类型和合理的长度以及文件上的元数据,因此不存在明显的 header 问题。谁能想到这在浏览器中不起作用的任何其他原因吗?

编辑

为了提供更多详细信息,我在 Fauxton 中上传了一份 pdf 文件,该文件按预期工作并显示在浏览器中。然后,我使用 saveDoc 函数上传了相同的 pdf,它以某种方式为文档的长度添加了大量数据。

在 Fauxton 上传的版本:

  "_attachments": {
    "03_IKB-RH_FUB_mitDB.pdf": {
      "content_type": "application/pdf",
      "revpos": 5,
      "digest": "md5-tX7qKPT6b7Ek90GbIq9q8A==",
      "length": 462154,
      "stub": true
    }
  }

以编程方式上传的版本:

  "_attachments": {
    "03_IKB-RH_FUB_mitDB.pdf": {
      "content_type": "application/pdf",
      "revpos": 4,
      "digest": "md5-Zy8zcwHmXsfwtleJNV5xHw==",
      "length": 616208,
      "stub": true
    }
  }

最佳答案

特定._attachments{}成员的data属性应该是base64,而不是dataURL .

当您将文件转换为 dataURL 时,您确实会获得 Base64 编码的二进制文件,但带有特殊前缀。截断前缀,仅保存 Base64 编码的尾部。

基本上,要获得有效的 base64,您应该从 dataURL 编码字符串的开头删除 data:*/*;base64, 前缀。

UPD。深入研究后发现,.attachment.insert(url, name, filedata, type)方法接受二进制(不是base64)作为文件数据。要从 FileReader 获取二进制文件,应使用 fr.readAsArrayBuffer() 而不是 fr.readAsDataURL()

关于node.js - 上传的文件在浏览器中显示base64数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48474703/

相关文章:

node.js - Electron 需要神秘

html - 每个网页的最大 <iFrame> 标记数

css - 如何清理乱七八糟的样式表?

c - 一个unsigned char *指向的内存区大小是多少?

node.js - 如何延迟使用Q.all?

javascript - V8 如何使用隐藏类和内联缓存优化代码

java - 如何在 javafx 浏览器中操作链接

java - 最佳编码方式

javascript - 在 HTML 中使用 img 时的最佳实践是什么

node.js - mongodb 中的 $pullAll 不起作用