Я уже несколько дней пытаюсь создать загрузчик файлов с использованием 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']));
Результаты, которые я получил:
Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.Проверяется после сохранения в SQL с помощью phpMyAdmin 5.
Ожидаемые результаты должны заключаться в правильном сохранении файлов любого типа.
ПРИМЕЧАНИЕ. Класс API — это всего лишь небольшой класс, который включает параметры для $.post, поэтому мне не нужно вводить их все время.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Первая проблема заключалась в том, что я хранил двоичные данные в SQL, который не предназначен для такого типа использования. Это привело к повреждению двоичных данных базой данных SQL.
Поэтому я перепроектировал свое хранилище файлов, используя локально хранящиеся двоичные файлы (.bin) и SQL, чтобы предоставить все метаданные файлов, включая путь и более продвинутый ACL.
Для защиты данных я использую правило перезаписи RewriteRule ^data/.*$ - [F,L]. Это предотвращает прямой доступ пользователя к двоичным данным. Поэтому защитите файл .
После внесения изменений я смог сохранить файлы через API приложения, используя метод readAsDataURL для извлечения закодированных двоичных данных и отправки их в PHP API.
@ maiorano84, хорошо, приятно знать. А вы знаете какой-нибудь другой способ? Я хочу иметь возможность опубликовать приложение PHP, чтобы другие могли использовать его на github. И я точно знаю, что не все услуги веб-хостинга предлагают такую гибкость. Тем не менее, я сделаю предложение по программному обеспечению во время установки. До сих пор RewriteRule, похоже, выдавал ошибку 403 при непосредственном вводе URL-адреса.
Корень проекта не обязательно должен быть корнем документа. Многие проекты уже следуют этой практике. Взгляните на Laravel и Symfony, чтобы увидеть, как вы можете структурировать свой проект, не обязательно беспокоясь о деталях сервера пользователя.
@ maiorano84 Я построил маршрутизатор php и настроил файл .htaccess, чтобы разрешить доступ только к index.php и api.php. Это то, что вы имеете в виду?
Добавление правила перезаписи не «защитит» его. Ваше регулярное выражение не помешает атаке с обходом каталога получить доступ к вашим файлам. Вместо этого переместите папку из веб-корня и пусть ваш серверный язык читает их из этого места.