将 base64 保存到 Digital Ocean 空间上的图像/视频

Save base64 to image / video on Digital Ocean spaces

我正在使用数字海洋空间。我在 GitHub 上找到了 Spaces-API。现在它提供了使用以下代码上传文件的选项,我可以上传图片了。

要求:从客户端 clide,我将使用 Ionic 传递 base64。我想知道如何将其传递并保存为 JPEG。

<?php
require_once("spaces.php");
$my_space = Spaces("M6Z255BGH6RROB5EUB3O", "vXF4XhpZ7/OyBINQaDNXex4DLuR/cBPDjfARhoSLB2A")->space("pbro", "fra1");

//Upload some text.
$my_space->upload("Super cool content", "example1.txt");

//Upload some image.
$my_space->uploadFile("img.png", "img_1.png");

//Uploaded!
?>

你需要在参数中发送base64编码的文件和它的扩展名,这样你就可以很容易地把那个文件写成它的原始扩展名,你可以像这样使用一个常用的函数

function createImageFromBase64($data,$folder,$file) {

   if (!file_exists($folder)) {
      mkdir($folder, 0755, true);
   }

   list($type, $data) = explode(';', $data);
   list(, $data)      = explode(',', $data);
   //Note you only need this if you're sending base64 along with it's native 
   //delimeters otherwise you can skip above two lines.
   $data               = base64_decode($data);

   file_put_contents($folder.'/'.$file, $data); }

选项 1:

使用 `upload` 方法并将图像内容作为文本传递,但首先对其进行解码:
$my_space->upload(base64_decode($encodedImage), 'img.jpg')

这行不通,因为 Spaces 将以这种方式上传的文件视为文本文件,并且 returns 使用 application/octet-stream header.

选项 2:

首先将解码后的内容转储到临时文件,这样您可以检查图像是否有效并在推送到空间之前对其进行处理例如:

$filepath = tempnam(sys_get_temp_dir(), 'spacesupload');
file_put_contents($filepath, base64_decode($encodedImage));

// process file here

$my_space->uploadFile($filepath, "img_1.png");

// remove uploaded file from server
unlink($filepath);

备注

从前端传递到后端的数据可能不是文件内容,而是格式 data:image/gif;base64,[encoded string]。在那种情况下,您只需要获取编码字符串即可推送到空格,例如:

$encodedString = explode('base64,', 'data:image/gif;base64,[encoded string]', 2);
if (count($encodedString) !== 2) {
    throw new \RuntimeException('Invalid encoded image string');
}

$encodedImage = $encodedString[1];

// proceed with upload
// ...