Как закодировать (base64) большой двоичный объект PDF-файла с помощью javascript и декодировать в PHP для сохранения в 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.info(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-файл содержит только пустую страницу.
  • Результаты одинаковы при использовании трех методов (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 — это всего лишь небольшой класс, который включает параметры для $.post, поэтому мне не нужно вводить их все время.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первая проблема заключалась в том, что я хранил двоичные данные в SQL, который не предназначен для такого типа использования. Это привело к повреждению двоичных данных базой данных SQL.

Поэтому я перепроектировал свое хранилище файлов, используя локально хранящиеся двоичные файлы (.bin) и SQL, чтобы предоставить все метаданные файлов, включая путь и более продвинутый ACL.

Для защиты данных я использую правило перезаписи RewriteRule ^data/.*$ - [F,L]. Это предотвращает прямой доступ пользователя к двоичным данным. Поэтому защитите файл .

После внесения изменений я смог сохранить файлы через API приложения, используя метод readAsDataURL для извлечения закодированных двоичных данных и отправки их в PHP API.

Добавление правила перезаписи не «защитит» его. Ваше регулярное выражение не помешает атаке с обходом каталога получить доступ к вашим файлам. Вместо этого переместите папку из веб-корня и пусть ваш серверный язык читает их из этого места.

maiorano84 27.01.2023 14:50

@ maiorano84, хорошо, приятно знать. А вы знаете какой-нибудь другой способ? Я хочу иметь возможность опубликовать приложение PHP, чтобы другие могли использовать его на github. И я точно знаю, что не все услуги веб-хостинга предлагают такую ​​гибкость. Тем не менее, я сделаю предложение по программному обеспечению во время установки. До сих пор RewriteRule, похоже, выдавал ошибку 403 при непосредственном вводе URL-адреса.

Louis Ouellet 27.01.2023 17:28

Корень проекта не обязательно должен быть корнем документа. Многие проекты уже следуют этой практике. Взгляните на Laravel и Symfony, чтобы увидеть, как вы можете структурировать свой проект, не обязательно беспокоясь о деталях сервера пользователя.

maiorano84 27.01.2023 17:32

@ maiorano84 Я построил маршрутизатор php и настроил файл .htaccess, чтобы разрешить доступ только к index.php и api.php. Это то, что вы имеете в виду?

Louis Ouellet 27.01.2023 17:44

Другие вопросы по теме