繁体   English   中英

如何使用 javascript 编码 (base64) PDF 文件的 blob,并在 PHP 中解码以保存在 SQL 中?

[英]How do I encode (base64) a PDF file's blob using javascript and decode in PHP to save in SQL?

几天来我一直在尝试使用 AJAX 和 PHP 构建文件上传器。我能够毫无问题地上传图像。 但是每当涉及到 PDF 时,我都会得到空白页。

这是我尝试使用 FileReader 的结果:

for(const [key, file] of Object.entries($('input').prop('files'))){
  const reader = new FileReader()
  reader.onload = function(event){
    var object = {
      name:file.name,
      size:file.size,
      type:file.type,
      content:reader.result,
    }
    API.post("file/upload/?csrf="+CSRF,object,{
      success:function(result,status,xhr){
        console.log(result)
      }
    })
  }
  reader.readAsDataURL(file)
}

在 PHP 中:

// $_POST['content'] = base64_decode(str_replace('data:' . $_POST['type'] . ';base64,', '', $_POST['content']));
// $_POST['content'] = base64_decode($_POST['content']);
$_POST['content'] = base64_decode(urldecode($_POST['content']));

我得到的结果:

  • 上传图片:好的!
  • 上传单个页面 PDF: PDF 文件只包含一个空白页面。
  • 使用 3 种方法(readAsDataURL、readAsBinaryString、readAsText)的结果相同。
  • 使用 readAsText 我不断得到: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.

验证一次保存在 SQL 使用 phpMyAdmin 5.

预期结果应该是任何文件类型都应该被正确保存。

注意:API class 只是一个小的 class,其中包含 $.post 的参数,因此我不必一直键入它们。

第一个问题是我将二进制数据存储在 SQL 中,这不适合此类用途。 这导致 SQL 数据库损坏二进制数据。

因此,我使用本地存储的二进制文件 (.bin) 和 SQL 重新设计我的文件存储,以提供文件的所有元数据,包括路径和更高级的 ACL。

为了保护数据,我使用重写规则RewriteRule ^data/.*$ - [F,L] 这可以防止用户直接访问二进制数据。 因此保护文件。

一旦做出更改,我就可以通过应用程序的 API 使用readAsDataURL方法保存文件,以检索编码的二进制数据并将其发送到 PHP API。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM