【问题标题】:Problems with opening blob files打开 blob 文件的问题
【发布时间】:2020-01-22 08:28:18
【问题描述】:

不明白为什么它不显示 Blob 文件。代码是:

openBlob = fileBuffer => {
const file = new Blob([fileBuffer], { type: "image/bmp" }); // You could also add the MIME type here as { type: "application/pdf" }
const fileURL = URL.createObjectURL(file);
console.log("fileURL" + fileURL)
window.open(fileURL, "_blank_");
 };

render() {
const archivioItems = this.state.archivio.map((archivio, i) => {
  return (
    <tr key={archivio.hash_referto}>
      <td>{archivio.tipo_esame}</td>
      <td>{archivio.data_esame}</td>
      <td>
        <Tab icon={<AssignmentIcon />}              
          className="tab"
           onClick={() => this.openBlob(archivio.uri)}></Tab>
      </td>
    </tr>
  )
})

它会以 pdf 格式打开一个新页面,但随后会返回“无法打开 pdf 文档”的警报(即使它是 pdf 文档)。还有,有没有办法打开任何类型的文档?

【问题讨论】:

  • 嘿,需要澄清一下。 achivio.uri 是缓冲区还是只是文件的 uri?
  • 该文档的 uri 太大,所以我将它作为 Blob 存储在数据库中

标签: javascript reactjs blob


【解决方案1】:

使用 Blob 时,请确保传递给构造函数的参数是文件缓冲区。 正如 cmets 所阐明的,您将文件保存为数据库中的 blob,假设 archivio.uri 已经是 blob(如评论中所述)。那么它不需要重新应用 blob 只需将数据本身传递给URL.createObjectUrl。如果不是这种情况并且数据库项目不是 blob,请确保首先从 uri 读取文件内容,然后将文件数据转换为 blob 并将其呈现给用户。

您可以在此处阅读有关加载 uri 文件然后将其转换为 blob 的方法的更多信息: load uri and convert to blob

更新

案例#1

openBlob = (fileBuffer) => { //file buffer is already a buffer
const fileURL = URL.createObjectURL(fileBuffer);
console.log("fileURL" + fileURL)
window.open(fileURL, "_blank_");
 };

案例#2

fileBuffer 不是 buffer 而是文件的 URI。 请注意,此操作是异步的,因为存在从远程 URI 读取文件的操作。

openBlob = (fileUri) => {
    let fileReader = new FileReader()
    const data = fileReader.readAsArrayBuffer(fileUri)
    .then(function(buffer){
        const blob = new Blob(buffer,{type:".....what ever is your type..."})
        console.log("File Blob:")
        console.log(blob)
        window.open(blob,"_blank_")
    })
}

【讨论】:

  • @mikerug88 根据需要更新了答案,提供了两种情况,一种是函数的输入已经是一个文件 blob,另一种是有进程读取远程 URI 文件并将其转换blob 然后将其呈现给用户。
  • 谢谢,真的,但它显示“未捕获的类型错误:无法在 'URL' 上执行 'createObjectURL':找不到与提供的签名匹配的函数。”
  • typeof fileBuffer = object
  • 原因可能是:我将数据库中的属性类型设置为Blob,但是当我将uri存储在数据库中时,我没有将其转换为Buffer。也许?
  • 1. URL 对象来自窗口对象,如果未找到,请尝试 window.URL.createObjectUrl。 2. 如果所需的函数从数据库中读取一个 URL,那么案例 2 将匹配您的工作,如果数据库 URI 存储了一个缓冲区,那么案例 1 将执行此操作。如果以 blob 的形式存储在 DB 中,请确保将其存储为 blob。
猜你喜欢
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多