Здравствуйте, ребята, я успешно нашел метод, который утверждает, что файл ввода файла в строку базы 64 в JavaScript, поэтому я успешно отправил эту базу 64

строка JSON через AJAX и строка в кодировке base 64 выглядит так, как это было отправлено в методе JSON «photo»: «data: image / jpeg; base64, / 9j / 4AAQSkZJRgABAQEASABIAAD / 2wB и т. д. ….»

Поэтому, когда строка base 64 поступает в файл PHP. PHP делает это волшебно и успешно сохраняет файл в целевой папке, где я хочу, чтобы файл был, поэтому, когда я смотрю в эту папку, есть файл, но

когда я пытаюсь открыть файл фотографии, чтобы просмотреть его, приложение для просмотра фотографий говорит что-то вроде: image.jpg похоже, что мы не поддерживаем этот формат файла, а в других приложениях для просмотра фотографий это что-то говорит

похоже на то, что я сделал не так?

Вот мой код

index.php

{amp}lt;style{amp}gt; #photo-input{ display: block; margin-bottom: 50px; } {amp}lt;/style{amp}gt; {amp}lt;script{amp}gt; document.addEventListener('DOMContentLoaded',function(){ document.querySelector('#submit').addEventListener('click',function(){ var photo_input= document.querySelector('#photo-input').files[0]; //Convert #photo-input content into a base 64 string var reader = new FileReader(); reader.readAsDataURL(photo_input); reader.onload = function (){ var photo_input_result= reader.result; sendUploadInfo(photo_input_result); } // }); function sendUploadInfo(photo_input_result){ var photo= photo_input_result; //{amp}lt;JSON data{amp}gt; var upload_info = { first_name: "John", last_name: "Smith", photo: photo }; //{amp}lt;/JSON data{amp}gt; var upload_info_json_object= 'upload_info_json_object=' JSON.stringify(upload_info); //{amp}lt;AJAX{amp}gt; var xhr= new XMLHttpRequest(); xhr.onreadystatechange= function(){ if(xhr.readyState == 4){ document.querySelector('#output').innerHTML= xhr.responseText; } } xhr.open('POST','x'); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send(upload_info_json_object); //{amp}lt;/AJAX{amp}gt; } }); {amp}lt;/script{amp}gt; {amp}lt;input type='file' id='photo-input'{amp}gt; {amp}lt;button id='submit'{amp}gt;Send JSON data{amp}lt;/button{amp}gt; {amp}lt;div id='output'{amp}gt;{amp}lt;/div{amp}gt; 

x.php

 {amp}lt;?php $upload_info_json_object = json_decode($_POST['upload_info_json_object']); $first_name= $upload_info_json_object-{amp}gt;first_name; $last_name= $upload_info_json_object-{amp}gt;last_name; //Photo upload section $photo= $upload_info_json_object-{amp}gt;photo; base64_decode($photo); $path= $_SERVER['DOCUMENT_ROOT'].'/send-json-data-by-ajax/object-based/with-file/2/images/image.jpg'; file_put_contents($path, $photo); // ?{amp}gt; {amp}lt;h1{amp}gt;{amp}lt;?php echo $first_name.' '.$last_name.' just uploaded a photo.'; ?{amp}gt;{amp}lt;/h1{amp}gt; 

Я думаю, что вы должны полностью отказаться от своей нынешней методологии и заменить ее следующим:

 {amp}lt;form action="x.php" method="post" enctype="multipart/form-data"{amp}gt; {amp}lt;input type="hidden" name="first_name" value="John" /{amp}gt; {amp}lt;input type="hidden" name="last_name" value="Smith" /{amp}gt; {amp}lt;input type="file" name="photo" accept="image/*" /{amp}gt; {amp}lt;input type="submit" value="Upload Photo" /{amp}gt; {amp}lt;/form{amp}gt; 

Затем в коде на стороне сервера проверьте результаты следующим образом:

 {amp}lt;?php print_r($_POST); // All of your post fields print_r($_FILES); // All of the file uploads 

Посмотрите на move_uploaded_file() когда вы знаете, куда хотите его поместить.

Есть много преимуществ:

  • Реальная загрузка двоичных файлов без потерь и накладных расходов в размере 33% от base-64, а также с процессорами с каждой стороны, чтобы справиться с этим
  • Ввод изображения, который принимает только изображения ( accept="image/*" )
  • Форма может быть отправлена ​​программами чтения с экрана и другими элементами управления браузера, а не просто кнопкой без контекста
  • JavaScript вообще не нужен!
  • Стандартные потоковые загрузки для меньшего использования памяти на вашем сервере.
  • Нет необходимости кодировать / декодировать потенциально огромный JSON-объект.

Брэд указал более эффективный способ, но, следуя вашему коду, я вижу, что вы сохраняете строку, а не результат base64_decode.

Изменить

 //Photo upload section $photo=$upload_info_json_object-{amp}gt;photo; base64_decode($photo); 

для

 //Photo upload section $photo=$upload_info_json_object-{amp}gt;photo; $photo=base64_decode($photo); 

Я вижу пару основных проблем:

  1. В строке 13 x.php вы вызываете base64_decode , но не присваиваете результат. Если следует читать как $photo = base64_decode($photo);

  2. Префикс, используемый для отображения изображения в браузере ( data:image/jpeg;base64, ), не должен включаться в записанный файл. Таким образом, ваш окончательный декодер должен выглядеть примерно так:

 $photo = base64_decode(explode(",",$photo,2)[1]); 

Там, где explode разделяется на первую запятую, возвращает массив, и мы получаем доступ только ко второму элементу, который содержит остальную часть строки, так как мы ограничиваем его до 2 элементов, то есть это безопасно, если запятая будет позже. (Использование substr и strpos может быть немного более эффективным, так что это также хороший вариант)

Если тип файла не всегда JPEG, вы также захотите проанализировать эту первую часть, чтобы вы знали, что использовать в имени файла (по крайней мере, если вы заботитесь о переносимости).


Если это не решит вашу проблему, начните устранять неполадки постепенно: возьмите значение из JavaScript и сравните его со значением из PHP перед декодированием. Они идентичны? Часто вы можете получить некоторую дополнительную кодировку (например, URL-кодированную) в зависимости от конфигурации, поэтому важно исключить это.

Если строки выглядят одинаково, я бы перешел к функции base64_decode и установил для необязательного параметра $strict значение true . Это заставит его возвращать false, если есть какие-либо не-base64 символы (вместо того, чтобы молча отбрасывать их).

Вы также можете попробовать протестировать небольшую известную строку (обходя кодировку, чтобы убедиться, что это не проблема), например черный GIF размером 1×1 пикселей:

 R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs= 

Вы можете протестировать то же самое непосредственно в PHP, чтобы исключить любую проблему кодирования или декодирования объекта JSON или его обработки в процессе передачи.

Привет всем, кого я по какой-то причине узнал, как строение строки base 64 в JSON кажется несовместимым на стороне PHP. Я провел тест, в котором отправил строку в кодировке Base 64 в объекте JSON на сторону PHP и сравнил ее с строкой в ​​кодировке Base 64 того же файла из

https://www.browserling.com/tools/image-to-base64 в операторе if else, например, если для него совпадают, и в другом месте, где говорится, что он не совпадает, и, к моему удивлению, я обнаружил, что он дал мне else утверждение означает, что они не соответствуют сообщению, поэтому я узнал, что путь строки 64 является

закодированный и структурированный на стороне JavaScript не читается прямо на стороне PHP. Поэтому никакие приложения для просмотра фотографий не могли прочитать фотографию. Я предполагаю, что определенные символы в кодированной JSON строке 64 строки, но обе сравниваемые строки из моего if

Тест оператора else выглядит точно так же, поэтому я решил эту проблему, прибегнув к поиску метода, который может экранировать специальные символы на стороне клиента, и обнаружил вызов этого метода encodeURIComponent (); он экранирует специальные символы, но для URL-адресов, поэтому я хорошо сказал, что я

я попробовал это к своему удивлению, когда я использовал это в зашифрованной строке base 64 для объекта JSON, это успешно сделало эту строку base 64 понятной на стороне сервера PHP, и я смог просмотреть фотографию без проблем

Вот мой рабочий пример

index.php

 {amp}lt;style{amp}gt; #photo-input{ display: block; margin-bottom: 50px; } {amp}lt;/style{amp}gt; {amp}lt;script{amp}gt; document.addEventListener('DOMContentLoaded',function(){ document.querySelector('#submit').addEventListener('click',function(){ var photo_input= document.querySelector('#photo-input').files[0]; //Convert #photo-input content into a base 64 string var reader = new FileReader(); reader.readAsDataURL(photo_input); reader.onload = function (){ var photo_input_result= reader.result; sendUploadInfo(photo_input_result); } // }); function sendUploadInfo(photo_input_result){ //Remove the data:image/file_extension;base64, prefix by not removing this you wont be able to view this as a file in any computing application var remove_the_photo_file_reader_prefix= photo_input_result.split(',')[1]; // //Escape incompatible characters that won't work properly in JSON and PHP var escape_incompatible_characters_from_the_photo= encodeURIComponent(remove_the_photo_file_reader_prefix); // var photo= escape_incompatible_characters_from_the_photo; //{amp}lt;JSON data{amp}gt; var upload_info = { first_name: "John", last_name: "Smith", photo: photo }; //{amp}lt;/JSON data{amp}gt; var upload_info_json_object= 'upload_info_json_object=' JSON.stringify(upload_info); //{amp}lt;AJAX{amp}gt; var xhr= new XMLHttpRequest(); xhr.onreadystatechange= function(){ if(xhr.readyState == 4){ document.querySelector('#output').innerHTML= xhr.responseText; } } xhr.open('POST','x'); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send(upload_info_json_object); //{amp}lt;/AJAX{amp}gt; } }); {amp}lt;/script{amp}gt; {amp}lt;input type='file' id='photo-input'{amp}gt; {amp}lt;button id='submit'{amp}gt;Send JSON data{amp}lt;/button{amp}gt; {amp}lt;div id='output'{amp}gt;{amp}lt;/div{amp}gt; 

x.php

 {amp}lt;?php $upload_info_json_object = json_decode($_POST['upload_info_json_object']); $first_name= $upload_info_json_object-{amp}gt;first_name; $last_name= $upload_info_json_object-{amp}gt;last_name; //Photo upload section $photo= $upload_info_json_object-{amp}gt;photo; //Decode into a file $photo= base64_decode($photo); file_put_contents('geeksforgeeks-22.jpg',$photo); // ?{amp}gt; {amp}lt;h1{amp}gt;{amp}lt;?php echo $first_name.' '.$last_name.' just uploaded a photo.'; ?{amp}gt;{amp}lt;/h1{amp}gt; 

поэтому моя проблема в том, что если я попытаюсь использовать encodeURIComponent (); метод на видео, закодированном в строке 64 базы, он дал мне эту ошибку

Uncaught RangeError: Неверная длина строки

Поэтому мне нужно найти другой метод, который экранирует символы в кодированной строке base 64 в объекте JSON на стороне клиента, чтобы он был понятным для стороны PHP, другими словами, что-то вроде what encodeURIComponent (); делает, но не для URL, но для строки в кодировке Base 64 на клиенте, независимо от того, насколько велика строка в кодировке Base 64 на стороне клиента.