#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); }