Сохранение base64 в изображение / видео на цифровых океанских просторах

#php #ionic-framework #digital-ocean

#php #ionic-framework #digital-ocean

Вопрос:

Я использую Digital Ocean spaces. Я нашел Spaces-API на GitHub. Теперь он дает возможность загрузить файл, используя приведенный ниже код, и я могу загрузить изображение.

Требование: из клиентского интерфейса я буду передавать base64 с использованием Ionic. Мне интересно, как я могу передать и сохранить его в формате 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!
?>
 

Ответ №1:

Вариант 1:

Используйте метод `upload` и передайте содержимое изображения в виде текста, но сначала расшифруйте его:

 $my_space->upload(base64_decode($encodedImage), 'img.jpg')
 

Это не сработает, потому что Spaces обрабатывает файлы, загруженные таким образом, как текстовые файлы, и возвращает их с application/octet-stream заголовком.

Вариант 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
// ...
 

Комментарии:

1. Изображение загружено с проблемой — когда я открываю изображение по прямой ссылке, оно загружается вместо открытия, причина, которую я нашел — Content-Type application/octet-stream , я думаю, это должно быть Content-Type image/png или Content-Type image/jpg , как мне с этим справиться?

2. Пожалуйста, обратите внимание: я использую вариант 1

3. Извините, я не так много знаю пробелов. Но я подозреваю, что Ionic может отправлять не только содержимое закодированного изображения, но и mime-тип. Формат тогда data:image/gif;base64,[encoded string] . В этом случае вам нужно будет получить закодированную строку только для переноса в пробелы

4. Ток для тестирования я просто жестко кодирую PHP напрямую, в данный момент не использую Ionic, я НЕ ДОБАВЛЯЮ data:image/gif;base64, , вот что я делаю $my_space->upload(base64_decode("iVBORw0...... , но даже после добавления это не работает

5. Возможно, что пробелы не позволяют загружать изображение в виде строки. Попробуйте вариант 2. Если это сработает, я обновлю свой ответ

Ответ №2:

Вам нужно отправить файл с кодировкой 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); }